C言語でexecveを用いてシェルを起動する
#include <unistd.h>
int main() {
char filename[] = "/bin/sh\x00";
char **argv = 0;
char **envp = 0;
execve(filename, argv, envp);
}
execveシステムコールを呼び出す処理をアセンブリで書く
コンパイラはNASM
BITS 32
jmp short two
one:
pop ebx ;
xor eax, eax ;
mov [ebx+7], al ;
mov [ebx+8], ebx ;
mov [ebx+12], eax ;
lea ecx, [ebx+8] ;
lea edx, [ebx+12] ;
mov al, 11 ;
int 0x80 ;
two:
call one ;
db '/bin/shXAAAABBBB' ;
コンパイル用のMakefile
exec_shell_c:
gcc exec_shell.c
exec_shell_s:
nasm exec_shell.s
参考
- HACKING: 美しき策謀 脆弱性の理論と実際 (オライリー・ジャパン)