GDB調試Linux程序流程

安裝加強工具gef
有符號表可以根據變量名函數名等進行調試
在程序編譯時一定要加上-g的參數,把源程序信息編譯到執行文件中
在這裏插入圖片描述
u,until
寄存器
eax存返回值
p $eax=0#修改寄存器的值
64位linux操作系統中
函數調用參數依次存放在rdi rsi rdx rcs r8 r9,超過6個則將多出的參數壓入棧
32位不存寄存器,直接壓棧
常用指令
vmmap #查看地址段
heap #查看堆
p value/d #十進制打印
p result =0#給變量賦值
x/20w(word)x(hex) 0x604010(address)#查看此內存20個字長度的16進制數
x/20bx
x/20#不寫單位默認gz
x/20gz#八字節查看內存地址的值
info frame(棧) 0(第0個棧)#查看當前棧的內容,rip爲當前執行位置
x/10i address#查看地址代碼
l(list) 函數名#查看函數代碼,用set listsize *設置顯示行數
stack 100#查看100行棧佈局

查看內存命令 x/ n、f、u是可選的參數。表示一個內存地址。

n是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。

f表示顯示的格式,參見上面。如果地址所指的是字符串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。

u表示從當前地址往後請求的字節數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字符來代替,b表示單字節,h表示雙字節,w表示四字節,g表示八字節。當我們指定了字節長度後,GDB會從指內存定的內存地址開始,讀寫指定字節,並把其當作一個值取出來。
條件斷點
b 行/函數/… if(var == value)
b 41 if pdata->id==2
b 函數名
查看符號表

readelf -s 程序

查看入口地址
在這裏插入圖片描述
GDB si,ni,s,n的區別
n/s都是C語言級的斷點定位。 s會進入C函數內部,但是不會進入沒有定位信息的函數(比如沒有加-g編譯的代碼,因爲其沒有C代碼的行數標記,沒辦法定位),n不會。

ni/si都是彙編級別的斷點定位。si會進入彙編和C函數內部,ni不會。

歸納:當要進入沒有調試信息的庫函數調試的時候,用si是唯一的方法。

當進入有調試信息的函數,用si和s都可以,但是他們不同,si是定位到彙編級別的第一個語句,但是s是進入到C級別的第一個語句

譬如si就是在0x80483e8.用s就是0x80483f1;

多線程與多進程調試
在這裏插入圖片描述
破解與防破解
Linux保護機制
在這裏插入圖片描述
系統ASLR沒開,PIE無效
canary寫入哈希,運行時比對
加殼

發佈了52 篇原創文章 · 獲贊 5 · 訪問量 4421
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章