Linux Hook技術(五)

今天咱們來點實戰(zhàn)的話題,對于前面我們研究的那么多知識,做一次總結.來看看這些節(jié)表之間是怎么聯(lián)系起來的.最后我們將經過一個簡單的攔截printf函數,修改它的參數,來輸出我指定的字符串,這樣就達到簡單的hook api的目的.好了廢話不多說.先看看test5.c里面的代碼.

#include <stdio.h>
#include <fcntl.h>
int main()
{
    while (1)
    {
        getchar();
        printf("hello");
        fflush(stdout);
    }
    return 0;
}

這段代碼很簡單,敲一個回車就輸出一個hello,我們的目的就是實現,敲一個hello讓他輸出我們指定的字符串.

首先先運行這個main程序.在另一個終端里面輸入ps -a 查看main 的進程ID.一會我們用GDB手動修改的時候要attach 連接他的進程 ID.

$ ps -a
ps1.png
ps2.png

這里是獲取main 程序的進程空間的映射,找到未被使用的空間來寫入我們指定的字符串,這里使用的指令是:

cat /proc/3963/maps            (3963為test5的pid)
test5.png

這里我們選用7fca11c2f000-7fca11c33000 rw-p 00000000 00:00 0在下面我們會向這個地址空間.寫入我們需要的字符串.(還可以選擇7fca11e42000-7fca11e44000 rw-p 00000000 00:00 0 或者7fca11e5c000-7fca11e5d000 rw-p 00000000 00:00 0 )

這里我們上面只是做了個提前預報會使用這個來獲取未使用空間,下面我們開始通過手動方式來攔截printf這個函數的參數.
啟動我們的調試器GDB(建議使用sudo gdb而不是直接gdb啟動)

直接啟動gdb可能會因為權限問題無法attach(attach是GDB一種重要的debug模式,在MPI程序debug中發(fā)揮重要的作用洗出。)


error.png
success.png
各個區(qū)域段的情況
registers.png

code.png

stack.png

首先萬事都是從main開始,所以先查看main函數處的代碼,距離我們的目標又近了一步,看到printf函數的調用的地方了.根據源代碼的分析,這里是唯一一個使用printf的函數調用的地方.

(gdb) disassemble main
main.png

根據ELF文件格式,printf跳轉的地址是PLT表內,所以查看PLT內的printf地址處的代碼,可見這里jmp跳轉的地址就是根據前面介紹的GOT表了.那么理論上,就應該跳轉到printf函數內去執(zhí)行了.但是其實不是的.linux采用了一個叫"懶模式"的加載方式,當某個函數第一次被調用,它才會把真正的地址放到GOT表內去.

(gdb) x/10i 0x555e3b0005d0
printf.png

所以我們查看下GOT表內的數據,發(fā)現這個地址很熟悉,這個0x555e3b0005db不正是plt表內的JMP下面的地址嘛.由此可見,當第一次加載函數的時候,其實GOT表內還沒有得到真正的函數地址,而是返回去支持PLT表內下面的之類,push跟jmp 然后push會把printf函數的相關偏移數據送入棧,jmp去尋找這個函數的地址,然后修改got表對應的地址處的值,這樣,當下次再調用printf的時候,那么GOT表內才是printf真正的函數地址

x/10xw 0x555e3b200fc0
image.png

首先我們對plt表內的0x555e3b0005d0地址下一個斷點

x/10b 0x555e3b0005d0
break *0x5579d2f305d0
image.png

然后讓程序繼續(xù)執(zhí)行.

continue

當你在main程序內輸入一個回車的時候,GDB就會收到信號通知,表示我們下的斷點起作用了.程序調用了printf函數.

Program received signal SIGTRAP, Trace/breakpoint trap.


image.png

這里查看下eip的值,把eip指向0x5579d2f305d0 printf@plt: jmp *0x5579d3130fc0
這條指令

info register rip
image.png
info register esp
image.png
x/10xw 0x7ffec7ba27e8
image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脸秽,隨后出現的幾起案子锰扶,更是在濱河造成了極大的恐慌,老刑警劉巖话速,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洒宝,死亡現場離奇詭異购公,居然都是意外死亡,警方通過查閱死者的電腦和手機雁歌,發(fā)現死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門宏浩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人靠瞎,你說我怎么就攤上這事绘闷。” “怎么了较坛?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扒最。 經常有香客問我丑勤,道長,這世上最難降的妖魔是什么吧趣? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任法竞,我火速辦了婚禮,結果婚禮上强挫,老公的妹妹穿的比我還像新娘岔霸。我一直安慰自己,他們只是感情好俯渤,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布呆细。 她就那樣靜靜地躺著,像睡著了一般八匠。 火紅的嫁衣襯著肌膚如雪絮爷。 梳的紋絲不亂的頭發(fā)上趴酣,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音坑夯,去河邊找鬼岖寞。 笑死,一個胖子當著我的面吹牛柜蜈,可吹牛的內容都是我干的仗谆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼淑履,長吁一口氣:“原來是場噩夢啊……” “哼隶垮!你這毒婦竟也來了?” 一聲冷哼從身側響起鳖谈,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤岁疼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缆娃,有當地人在樹林里發(fā)現了一具尸體捷绒,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年贯要,在試婚紗的時候發(fā)現自己被綠了暖侨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡崇渗,死狀恐怖字逗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宅广,我是刑警寧澤葫掉,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站跟狱,受9級特大地震影響俭厚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜驶臊,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一挪挤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧关翎,春花似錦扛门、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春政基,著一層夾襖步出監(jiān)牢的瞬間贞铣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工沮明, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辕坝,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓荐健,卻偏偏與公主長得像酱畅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子江场,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容