gdb-pada調試實例

先編寫個簡單的hello的程序

hello.c  (ps:有沒有頭文件行不行,試試不就知道了)
 1 int main(){
 2     printf("hello!\n");
 3     int m,n;
 4     int array[5] = {1,2,3,4,5};
 5     fun1(m,n);
 6     printf("array[0] = %d\n",array[0]);
 7     printf("array[-1] = %d\n",array[-1]);
 8     printf("array[7] = %d\n",array[7]);
 9     printf("%x\n");
10     char *a,*b,*c,*d;
11     a = malloc(20);
12     a = malloc(20);
13     a = malloc(200);
14     a = malloc(0x21000);
15     free(a);
16 }
17 int fun1(int a,int b){
18     a = 1;
19     b = 2;
20     return 0;
21 }

gcc編譯

雖然報了一些警告,可是不影響咱們的輸入     -m32 生成32位的

 給a.out文件執行權限,運行一下程序

 

gcc編譯 加一些別的參數能夠看到編譯過程的文件

 

編譯過程: c     預編譯    彙編   elf(可重定位文件)    .out 文件


 

 objdump 能夠查看彙編代碼

1 objdump -d hello

進入gdb

1 gdb ./hello
1 start   開始

disassemble  main    查看main函數彙編

1 info functions  查看程序的全部函數
1 l   查看代碼

1 c   運行

如今看看結果怎麼來的

l   查看代碼
tb   4   設置一次性斷點
run   運行

 

 

1 能夠看到程序運行到第四行,準備執行數據入棧,咱們先查看一下 ebp-0x20有什麼數據
x/10dw ebp-0x20

 

數據是看不懂的,繼續設置斷點運行程序

能夠看到運行到了第6行,準備取array[0]的數據,地址是ebp-0x20,再看看數據

發現就是入棧的數據
0xffffd068:    1    2    3    4
0xffffd078:    5    982188544    -134519844    -12128
繼續執行程序,設置斷點
tb 7
c

 mov    eax, dword ptr [ebp - 0x24]    取出數值而後賦值給eax
查看  ebp - 0x24
x/10dw $ebp-0x24

依次所見  array[7] = -12128
最後執行完程序看看結果
c

 

 


 

gdb-peda調試命令

 

 1 break *0x400100 (b main):在 0x400100 處下斷點
 2 tb一次性斷點
 3 info b:查看斷點信息
 4 delete [number]:刪除斷點
 5 watch *(int *)0x08044530:在內存0x0804453處的數據改變時stop
 6 x /4xg $ebp:查看ebp開始的4個8字節內容(b:單字節,h:雙字節,w:四字節,g:八字節;x:十六進制,s:字符串輸出,i:反彙編,c:單字符)
 7 p $eax:輸出eax的內容
 8 set $eax=4:修改變量值
 9 c:繼續運行
10 r:從新開始運行
11 ni:單步步過
12 si:單步步入
13 fini:運行至函數剛結束處
14 return expression:將函數返回值指定爲expression
15 bt:查看當前棧幀
16 info f:查看當前棧幀
17 context:查看運行上下文
18 stack:查看當前堆棧
19 call func:強制函數調用
20 ropgagdet:找common rop
21 vmmap:查看虛擬地址分佈
22 shellcode:搜索,生成shellcode
23 ptype struct link_map:查看link_map定義
24 p &((struct link_map*)0)->l_info:查看l_info成員偏移
相關文章
相關標籤/搜索