想有沒有一種方式能一邊使用GDB調(diào)試程序,一邊在需要的時(shí)候通過標(biāo)準(zhǔn)輸入傳遞構(gòu)造好的惡意數(shù)據(jù)(通常含有各種特殊字符,如\x01\x02\x03
等),這樣可以實(shí)時(shí)知道惡意數(shù)據(jù)輸入后,程序的狀態(tài)、執(zhí)行過程。而不是執(zhí)行exp,把程序弄崩潰,利用core file還原崩潰現(xiàn)場(chǎng)。
想了好幾種方式,最后是利用GDB的call命令來調(diào)用函數(shù)修改被調(diào)試程序的標(biāo)準(zhǔn)輸入,這樣程序可以從我們指定的文件里讀取特殊字符。
寫了個(gè)GDB Python插件,代碼在:https://github.com/Ovi3/pstdio
使用例子
編譯測(cè)試用的程序。read.c
:
#include "stdio.h"
int main(void){
char buf[32];
char buf1[32];
int len;
len = read(0, buf, 32);
buf[len] = 0;
write(1, buf, len);
len = read(0, buf1, 32);
buf1[len] = 0;
write(1, buf1, len);
return 0;
}
編譯:gcc -o read read.c
安裝pstdio:
git clone https://github.com/Ovi3/pstdio.git ~/pstdio
echo "source ~/pstdio/pstdio.py" >> ~/.gdbinit
開始調(diào)試gdb -q read
。
先看下幫助文檔:pstdio help
調(diào)試執(zhí)行到call <read@plt>
之前,執(zhí)行(有兩個(gè)反斜桿)
pstdio data /x \\x41\\x42\\x43\\x44\\x01\\x02\\x03\\x04
接著執(zhí)行ni
單步執(zhí)行call <read@plt>
后,數(shù)據(jù)就會(huì)被寫入。
或者在/path/to/data
文件里存數(shù)據(jù),接著執(zhí)行pstdio file /path/to/data
,再單步到call <read@plt>
,文件里的數(shù)據(jù)就會(huì)被寫入。
程序在重新運(yùn)行后,或者在執(zhí)行pstdio reset
后,程序的標(biāo)準(zhǔn)輸入就會(huì)恢復(fù),也就是數(shù)據(jù)從屏幕上輸入。