C言語でexecveを用いてシェルを起動する

#include <unistd.h>

int main() {
  char filename[] = "/bin/sh\x00";
  char **argv = 0;
  char **envp = 0; 
  execve(filename, argv, envp);
}
exec_shell.c

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: 美しき策謀 脆弱性の理論と実際 (オライリー・ジャパン)