一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ASM調(diào)試

 liluvu 2013-04-23

1. 最簡(jiǎn)單的代碼:

//// test1.c

int main(){

    return 1;

}

 

編譯、反匯編:

gcc test1.c

gdb ./a.out

(gdb) disassemble main

 

0x08048344 <main+0>:  lea    0x4(%esp),%ecx   ;取出esp寄存器里的值,加上4,將得到值傳遞給ecx

0x08048348 <main+4>:  and    $0xfffffff0,%esp  ;使棧地址16字節(jié)對(duì)齊

0x0804834b <main+7>:  pushl  -0x4(%ecx)  ;取出寄存器ecx的值,減去4,esp的值,將得到的值作為地址,在內(nèi)存找到該地址對(duì)應(yīng)的值,將其壓入棧中。

0x0804834e <main+10>:            push   %ebp

0x0804834f <main+11>: mov    %esp,%ebp  ;創(chuàng)建Stack Frame(??蚣?/span>)

0x08048351 <main+13>:            push   %ecx

0x08048352 <main+14>:            mov    $0x1,%eax

0x08048357 <main+19>:            pop    %ecx

0x08048358 <main+20>:            pop    %ebp

0x08048359 <main+21>:            lea    -0x4(%ecx),%esp  ;取出ecx 寄存器里的值,減去4,將得到值傳遞給esp;還原esp的值

0x0804835c <main+24>:            ret 

 

常用指令解釋:

CALL指令:

用來(lái)調(diào)用一個(gè)函數(shù)或過(guò)程,此時(shí),下一條指令地址會(huì)被壓入堆棧,以備返回時(shí)能恢復(fù)執(zhí)行下條指令。
RET
指令:

用來(lái)從一個(gè)函數(shù)或過(guò)程返回,之前CALL保存的下條指令地址會(huì)從棧內(nèi)彈出到EIP寄存器中,程序轉(zhuǎn)到CALL之前下條指令處執(zhí)行

ENTER指令:

建立當(dāng)前函數(shù)的??蚣?,即相當(dāng)于以下兩條指令:
        pushl   %ebp
        movl    %esp,%ebp

LEAVE
指令:

釋放當(dāng)前函數(shù)或者過(guò)程的??蚣?,即相當(dāng)于以下兩條指令:
        movl ebp esp
        popl ebp

 

2. 函數(shù)間的調(diào)用代碼:

假如函數(shù)A調(diào)用函數(shù)B,函數(shù)B調(diào)用函數(shù)C

///// test2.c

void c(){}

 

void b(){c();}

 

void a(){b();}

 

int main(){

   a();

   return 1;

}

編譯、反匯編:

gcc test1.c

gdb ./a.out

(gdb) disassemble main

Dump of assembler code for function main:

0x0804835d <main+0>:  lea    0x4(%esp),%ecx

0x08048361 <main+4>:  and    $0xfffffff0,%esp

0x08048364 <main+7>:  pushl  -0x4(%ecx)

0x08048367 <main+10>:            push   %ebp

0x08048368 <main+11>:            mov    %esp,%ebp

0x0804836a <main+13>:            push   %ecx

0x0804836b <main+14>:            call   0x8048353 <a>

0x08048370 <main+19>:            mov    $0x1,%eax

0x08048375 <main+24>:            pop    %ecx

0x08048376 <main+25>:            pop    %ebp

0x08048377 <main+26>:            lea    -0x4(%ecx),%esp

0x0804837a <main+29>:            ret   

End of assembler dump.

(gdb) disassemble a

Dump of assembler code for function a:

0x08048353 <a+0>:         push   %ebp

0x08048354 <a+1>:         mov    %esp,%ebp

0x08048356 <a+3>:         call   0x8048349 <b>

0x0804835b <a+8>:         pop    %ebp

0x0804835c <a+9>:          ret   

End of assembler dump.

(gdb) disassemble b

Dump of assembler code for function b:

0x08048349 <b+0>:         push   %ebp

0x0804834a <b+1>:         mov    %esp,%ebp

0x0804834c <b+3>:          call   0x8048344 <c>

0x08048351 <b+8>:         pop    %ebp

0x08048352 <b+9>:         ret   

End of assembler dump.

(gdb) disassemble c

Dump of assembler code for function c:

0x08048344 <c+0>:          push   %ebp

0x08048345 <c+1>:          mov    %esp,%ebp

0x08048347 <c+3>:          pop    %ebp

0x08048348 <c+4>:          ret   

End of assembler dump.

 

函數(shù)調(diào)用棧的狀態(tài):

    +-------------------------+----> 高地址
    | EIP (Main
函數(shù)返回地址)   |
    +-------------------------+
    | EBP (Main
函數(shù)的EBP)      | --+ <------當(dāng)前函數(shù)AEBPA (SFP框架指針)
    +-------------------------+   +-->offsetA
    | A
中的局部變量           | --+ <------ESP指向函數(shù)A新分配的局部變量,局部變量可以通過(guò)EBPA-offsetA訪問(wèn)
    +-------------------------+
    | Arg .(
函數(shù)B的參數(shù))     |   --+ <------ B函數(shù)的參數(shù)可以由BEBPB+offsetB訪問(wèn)
    +-------------------------+   +--> offsetB

   | EIP (A函數(shù)的返回地址)    |   |
    +-------------------------+ --+
    | EBP (A
函數(shù)的EBP)        |<--+ <------ 當(dāng)前函數(shù)BEBPB (SFP框架指針)
    +-------------------------+

    | B
中的局部變量          |  
    +-------------------------+  
    | Arg .(
函數(shù)C的參數(shù))     |  
    +-------------------------+  
    | EIP (B
函數(shù)的返回地址)   |  
    +-------------------------+ 
    | EBP (B
函數(shù)的EBP)       | --+ <------ 當(dāng)前函數(shù)CEBPC (SFP框架指針)
    +-------------------------+
    | C 中的局部變量          |
    | ..........              | <------ ESP
指向函數(shù)C新分配的局部變量

 +-------------------------+----> 低地址

函數(shù)被調(diào)用時(shí)
    1) EIP/EBP
成為新函數(shù)棧的邊界
   
函數(shù)被調(diào)用時(shí),返回時(shí)的EIP首先被壓入堆棧;創(chuàng)建??蚣軙r(shí),上級(jí)函數(shù)棧的EBP被壓入堆棧,與EIP一道行成新函數(shù)棧框架的邊界
    2) EBP
成為??蚣苤羔?/span>SFP,用來(lái)指示新函數(shù)棧的邊界
   
棧框架建立后,EBP指向的棧的內(nèi)容就是上一級(jí)函數(shù)棧的EBP,可以想象,通過(guò)EBP就可以把層層調(diào)用函數(shù)的棧都回朔遍歷一遍,調(diào)試器就是利用這個(gè)特性實(shí)現(xiàn) backtrace功能的
    3) ESP
總是作為棧指針指向棧頂,用來(lái)分配??臻g
   
棧分配空間給函數(shù)局部變量時(shí)的語(yǔ)句通常就是給ESP減去一個(gè)常數(shù)值,例如,分配一個(gè)整型數(shù)據(jù)就是 ESP-4
    4)
函數(shù)的參數(shù)傳遞和局部變量訪問(wèn)可以通過(guò)SFPEBP來(lái)實(shí)現(xiàn)
    由于??蚣苤羔樣肋h(yuǎn)指向當(dāng)前函數(shù)的?;刂?,參數(shù)和局部變量訪問(wèn)通常為如下形式:
        +8+xx(%ebp)         ;
函數(shù)入口參數(shù)的的訪問(wèn)
        -xx(%ebp)           ; 函數(shù)局部變量訪問(wèn)

 

3含局部變量時(shí):

int main(){

  int a = 3;

  int b = 5;

return 1;

}

 

(gdb) disassemble main

Dump of assembler code for function main:

0x08048344 <main+0>:  lea    0x4(%esp),%ecx

0x08048348 <main+4>:  and    $0xfffffff0,%esp

0x0804834b <main+7>:  pushl  -0x4(%ecx)

0x0804834e <main+10>:            push   %ebp

0x0804834f <main+11>: mov    %esp,%ebp

0x08048351 <main+13>:            push   %ecx

0x08048352 <main+14>:            sub    $0x10,%esp

0x08048355 <main+17>:            movl   $0x3,-0x8(%ebp)  ; a = 3

0x0804835c <main+24>:            movl   $0x5,-0xc(%ebp) ; b = 5;

0x08048363 <main+31>:            mov    $0x1,%eax ;return 1;

0x08048368 <main+36>:            add    $0x10,%esp

0x0804836b <main+39>:            pop    %ecx

0x0804836c <main+40>:            pop    %ebp

0x0804836d <main+41>:            lea    -0x4(%ecx),%esp

0x08048370 <main+44>:            ret   

End of assembler dump.

通過(guò)反匯編代碼對(duì)程序運(yùn)行時(shí)的寄存器和棧的觀察和分析,可以得出局部變量在棧中的訪問(wèn)和分配及釋放方式:
        1.
局部變量的分配,可以通過(guò)esp減去所需字節(jié)數(shù)
           sub    $0x10,%esp

        2.局部變量的釋放,可以通過(guò)esp加上已分配的字節(jié)
           add    $0x10,%esp     
        3.
局部變量的訪問(wèn),可以通過(guò)ebp減去偏移量
           movl   $0x3,-0x8(%ebp)

           

4. 函數(shù)調(diào)用時(shí)有參數(shù)

int func(int m, int n)

{

   return m+n;

}

 

int main(){

  int a = 3;

  int b = 5;

  int c = 0;

  c = func(a, b);

  return c;

}

 

(gdb) disassemble main

Dump of assembler code for function main:

0x0804834f <main+0>:   lea    0x4(%esp),%ecx

0x08048353 <main+4>:  and    $0xfffffff0,%esp

0x08048356 <main+7>:  pushl  -0x4(%ecx)

0x08048359 <main+10>:            push   %ebp

0x0804835a <main+11>:            mov    %esp,%ebp

0x0804835c <main+13>:            push   %ecx

0x0804835d <main+14>:            sub    $0x18,%esp

0x08048360 <main+17>:            movl   $0x3,-0x8(%ebp)  ;a = 3

0x08048367 <main+24>:            movl   $0x5,-0xc(%ebp)  ;b = 5

0x0804836e <main+31>:            movl   $0x0,-0x10(%ebp)  ;c = 0;

0x08048375 <main+38>:            mov    -0xc(%ebp),%eax  

0x08048378 <main+41>:            mov    %eax,0x4(%esp)  ; n = b

0x0804837c <main+45>:            mov    -0x8(%ebp),%eax

0x0804837f <main+48>: mov    %eax,(%esp)    ; m = a;

0x08048382 <main+51>:            call   0x8048344 <func>  ;func(a,b);

0x08048387 <main+56>:            mov    %eax,-0x10(%ebp) ; c = func(a, b);

0x0804838a <main+59>:            mov    -0x10(%ebp),%eax ; return c

0x0804838d <main+62>:            add    $0x18,%esp

0x08048390 <main+65>:            pop    %ecx

0x08048391 <main+66>:            pop    %ebp

0x08048392 <main+67>:            lea    -0x4(%ecx),%esp

0x08048395 <main+70>:            ret   

End of assembler dump.

(gdb) disassemble func

Dump of assembler code for function func:

0x08048344 <func+0>:   push   %ebp

0x08048345 <func+1>:   mov    %esp,%ebp

0x08048347 <func+3>:   mov    0xc(%ebp),%eax ; n

0x0804834a <func+6>:   add    0x8(%ebp),%eax ; m+n

0x0804834d <func+9>:   pop    %ebp

0x0804834e <func+10>: ret   

End of assembler dump.

參數(shù)的訪問(wèn),可以通過(guò)ebp加上減去偏移量:

mov    0xc(%ebp),%eax
add     0x8(%ebp),%eax

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    成人亚洲国产精品一区不卡| 白白操白白在线免费观看| 午夜国产精品国自产拍av| 国产精品亚洲精品亚洲| 亚洲av一区二区三区精品| 欧美黑人巨大一区二区三区 | 欧美一区日韩二区亚洲三区| 亚洲黄色在线观看免费高清| 中国一区二区三区人妻| 午夜精品在线观看视频午夜| 欧美成人国产精品高清| 91天堂免费在线观看| 免费播放一区二区三区四区| 麻豆在线观看一区二区| 国产日韩熟女中文字幕| 日本一区二区三区久久娇喘| 欧美日韩国产精品第五页| 免费高清欧美一区二区视频 | 日本高清不卡在线一区| 东北女人的逼操的舒服吗| 午夜精品黄片在线播放| 欧美午夜国产在线观看| 亚洲午夜av久久久精品| 欧洲一区二区三区蜜桃| 日韩在线视频精品视频| 日韩一级一片内射视频4k| 国产综合欧美日韩在线精品 | 午夜精品久久久99热连载| 日本不卡视频在线观看| 我想看亚洲一级黄色录像| 欧美一区二区三区高潮菊竹| 亚洲精品中文字幕无限乱码| 国产精品伦一区二区三区在线| 色婷婷视频在线精品免费观看| 日韩不卡一区二区视频| 日本91在线观看视频| 欧美黑人在线精品极品| 亚洲精品av少妇在线观看| 欧美日韩国内一区二区| 蜜臀人妻一区二区三区| 亚洲欧美日韩色图七区|