乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      分享一個有意思的gdb插件

       精品唯居 2021-04-24

      最近在一個技術(shù)分享上聽說了一個有意思的gdb插件:peta(https://github.com/longld/peda),使用它可方便地對C/C++代碼進行逆向工程

      效果圖
      peda的輸出分為三個框,一個顯示寄存器狀態(tài),一個顯示當前匯編指令,一個顯示stack狀態(tài)

      安裝方法很簡單,

      git clone https://github.com/longld/peda.git ~/peda
      echo "source ~/peda/peda.py" >> ~/.gdbinit
      echo "DONE! debug your program with gdb and enjoy"

      接下來寫個小程序試用下:

      #include <iostream>
      
      int main() 
      {
      int i = 10;
      i = i++;
      std::cout << i << std::endl;
      return 0;
      }

      執(zhí)行i = i++之后,i的值是多少呢?是10還是11?根據(jù)語言標準這其實是未定義行為,也就是返回什么值,主要取決于具體的編譯器實現(xiàn)。接下來我們在X86 GCC編譯看看結(jié)果如何?

      g++ -g -O0 1.cpp
      ./a.out
      10

      可以看到i的結(jié)果為10。為什么會這樣呢?我們逆向二進制a.out一探究竟

      gdb ./a.out

      peda截圖

      核心代碼如下,i從內(nèi)存load到寄存器之后,先執(zhí)行自增,然后先將自增結(jié)果11 save到內(nèi)存,再將i++返回值10 save到內(nèi)存,結(jié)果值11被10覆蓋,最終i的值為10。

         0x00000000004007ea <+8>:  mov    DWORD PTR [rbp-0x4],0xa   ; i = 10
         0x00000000004007f1 <+15>:mov    eax,DWORD PTR [rbp-0x4]   ; eax = i(10)
      => 0x00000000004007f4 <+18>:lea    edx,[rax+0x1]             ; edx = 11
         0x00000000004007f7 <+21>:mov    DWORD PTR [rbp-0x4],edx   ; i = edx(11)
         0x00000000004007fa <+24>:mov    DWORD PTR [rbp-0x4],eax   ; i = eax(10)

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多