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 }
雖然報了一些警告,可是不影響咱們的輸入 -m32 生成32位的
給a.out文件執行權限,運行一下程序
編譯過程: c 預編譯 彙編 elf(可重定位文件) .out 文件
1 objdump -d hello
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
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成員偏移