<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      跟羽夏學 Ghidra ——數據

      寫在前面

      ??此系列是本人一個字一個字碼出來的,包括示例和實驗截圖。本人非計算機專業,可能對本教程涉及的事物沒有了解的足夠深入,如有錯誤,歡迎批評指正。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閑錢,可以打賞支持我的創作。如想轉載,請把我的轉載信息附在文章后面,并聲明我的個人信息和本人博客地址即可,但必須事先通知我

      你如果是從中間插過來看的,請仔細閱讀 跟羽夏學 Ghidra ——簡述 ,方便學習本教程。請認準 博客園寂靜的羽夏 ,目前僅在該平臺發布。

      前言

      ??本篇涉及一些底層的知識,主要是變量在內存的分配情況。如果不清楚,可以參考我的 羽夏看C語言系列教程 。雖然是Win平臺的,但相差無幾,原理相通。
      ??在開始之前,一定要將代碼編譯好(其實上一篇就開始用了),這次我們要開始用示例進行學習工作。注意在簡述說的基礎知識都一定要會,不過我用的時候會提一下。
      ??本篇寂靜的羽夏的博文,將專注于variable函數的分析,緊扣“數據”關鍵詞。

      函數定位

      ??我們從分析variable函數開始,講解與數據相關的知識,首先需要定位。那么如何定位呢?
      ??通過上一篇博文的學習,我們知道了需要從Symbol Tree就能找到,雙擊就能跳轉到函數位置:

      ??與此同時,我們可以看到反匯編的內容:

      void variable(void)
      {
        gvar1 = 0x31;
        gvar2 = 5;
        puts("===");
        puts("===");
        gvar2 = 5;
        gstruct[0] = 1;
        gstruct._2_2_ = 2;
        gstruct._4_4_ = 3;
        gstruct._8_8_ = 4;
        gvar1 = 0x50;
        return;
      }
      

      ??和我們的源碼作比較:

      // Written by WingSummer
      void variable()
      {
          //局部變量
      
          gvar1 = '1';
          gvar2 = 5;
      
          puts("===");
      
          struct tstruct lstruct;
          lstruct.var1 = 1;
          lstruct.var2 = 2;
          lstruct.var3 = 3;
          lstruct.var4 = 4;
      
          // 全局變量賦值
          puts("===");
      
          gvar1 = 'P';
          gvar2 = 5;
      
          gstruct.var1 = 1;
          gstruct.var2 = 2;
          gstruct.var3 = 3;
          gstruct.var4 = 4;
      }
      

      ??可以看出,類型對不上,局部變量的結構體相關賦值被吃掉了。但是,Ghidra已經在反匯編結果中有了提示:

      undefined      AL:1              <RETURN>
      undefined8     Stack[-0x10]:8    local_10                       XREF[1]:  00401196(W)  
      undefined4     Stack[-0x14]:4    local_14                       XREF[1]:  0040118f(W)  
      undefined2     Stack[-0x16]:2    local_16                       XREF[1]:  00401189(W)  
      undefined1     Stack[-0x18]:1    local_18                       XREF[1]:  00401185(W)  
      

      ??Ghidra已經識別到了局部變量,但是,并沒有使用,反匯編并沒有將其列入。不過,我們先把反匯編的變量名和源代碼的名字弄的一致。有如下三種方法:

      • 在符號樹列表:

      • 在反編譯窗口:

      • 在反匯編窗口:

      ??你可以使用以上方式來修改。
      ??在我們的源代碼中gvar1 = '1',在反匯編就成了gvar1 = 0x31,這個是由于反匯編是使用的ASCII表示的字符1,我們有兩種方式進行轉化:

      • 在反編譯窗口:

      • 在反匯編窗口:

      ??與此同時,我們在程序中用到了大量的結構體,但是Ghidra并沒有完全給識別出來,那么怎么創建呢:

      ??在Data Type Manager中,選中tutorial(因為我的程序的名字叫這個),右擊菜單的New,然后找到Structure,點擊,最終的編輯結果:

      ??在這里注意的一點是,結構體是四個字節對齊的,至于為什么自己回去復習功課。
      ??我們編輯完畢后,點擊保存按鈕,那么我們如何使用我們自定義類型呢:

      ??點擊后,搜索找到我們的類型,點擊確定,最終會得到下面的結果:

      void variable(void)
      {
        tstruct lstruct;
        
        gvar1 = '1';
        gvar2 = 5;
        puts("===");
        puts("===");
        gvar2 = 5;
        gstruct.var1 = 1;
        gstruct.var2 = 2;
        gstruct.var3 = 3;
        gstruct.var4 = 4;
        gvar1 = 'P';
        return;
      }
      

      ??至此,創建結構體的方式學會了,我們就可以創建枚舉、別名、共用體。這些我就不在本篇贅述了,請自行觸類旁通。

      回到主函數

      ??下面我們回到主函數,繼續學習如何更改函數簽名以及修正原是字符串的未知類型。
      ??主函數的反編譯結果如下:

      undefined8 main(void)
      {
        int iVar1;
        int local_14;
        uint local_10;
        char local_9;
        
        while( true ) {
          while( true ) {
            while( true ) {
              while( true ) {
                puts(&DAT_004020d8);
                __isoc99_scanf(&DAT_0040218c,&local_14);
                if (local_14 != 2) break;
                loop();
              }
              if (2 < local_14) break;
              if (local_14 != 1) goto LAB_0040146a;
              variable();
            }
            if (local_14 != 3) break;
            test1();
            puts("===");
            test2(1);
            puts("===");
            local_9 = test3(5,0x41);
            printf("ret : %c",(ulong)(uint)(int)local_9);
            puts("===");
            local_10 = test4(1,2,3,4,5,6);
            printf("ret : %d",(ulong)local_10);
          }
          if (local_14 != 4) break;
          iVar1 = crackMe();
          if (iVar1 == 0) {
            puts(&DAT_004021c0);
          }
          else {
            puts(&DAT_004021a1);
          }
          setbuf(stdin,(char *)0x0);
        }
      LAB_0040146a:
        puts(&DAT_004021e8);
        getchar();
        return 0;
      }
      

      ??首先我們修改一下主函數的函數聲明,也就是函數簽名(有三種方式):

      • 在符號樹列表:

      • 在反編譯窗口:

      • 在反匯編窗口:

      ??點擊會彈出一個窗體,我們修改一下如下圖所示:

      ??可以看到,通過該對話框可以修改函數名、返回值、調用約定以及函數屬性(不定參數、內斂函數、無返回值),更改參數,這些可以自行探索。
      ??接下來我們看到puts(&DAT_004020d8)這樣的代碼,這明明是字符串,但并沒有識別到,僅僅被認為是普通數據。我們可以通過修改識別為ASCII字符串:

      ??修改后,是如下結果:

                            s__Ghidra_0._1._2._3._4._004020d8     XREF[2]:  main:0040132d(*), 
                                                                            main:0040132d(*)  
           004020d8 e6 ac       ds       E6h,ACh,A2h,E8h,BFh,8Eh,E6h,9Dh,A5h,
                   a2 e8 
                   bf 8e 
      

      ??但是這完全沒有正常字符串的樣子,這個是編碼問題。在 Linux 下,中文的編碼通常是UTF-8,我們需要修改一下:

      ??點擊后,就會彈出一下彈窗,修改如下:

      ??最終,我們的結果如下(由于字符串太長,被隱掉了):

                            s__Ghidra_0._1._2._3._4._004020d8     XREF[2]:  main:0040132d(*), 
                                                                            main:0040132d(*)  
           004020d8 e6 ac       ds       u8"歡迎來到“寂靜的羽夏”的 Ghidra 教學教程
                   a2 e8 
                   bf 8e 
      

      拓展

      ??在本寂靜的羽夏的實驗示例中,我們還沒有涉及數組以及如果將代碼識別為數據或者把數據是別為代碼,這怎樣處理,下面開始介紹。
      ??由于沒有提前設計,我們假設variable函數中的gvar2是一個數組,長度是5,那么我們如何轉化呢?

      ??在gvar2的位置右擊,找到Data,選中Create Array,你將會得到如下界面:

      ??輸入數字即可,由于它不是,就不用點確定了。
      ??下面我們取消之前的假設,我們做一個新的,假設variable函數開頭的一句匯編是數據,其實不是代碼,我們如何將其轉為數據呢?
      ??我們先把代碼轉為數據:

      ??點擊后,該處匯編將會變成未定義類型的字節。但我反悔了,我又想把它弄成數據(不要撤銷):

      ??右鍵菜單通常比較麻煩,這里只是為了介紹才這么做,通常用CD這兩個快捷鍵,對代碼和數據之間進行轉化。
      ??其次,我還沒有介紹如何更改類型,只是說了如何使用自己定義的類型。下面看一下:

      ??點擊后,會彈出一個對話框,輸入正確的類型名字即可。
      ??至此,該博文結束。

      下一篇

      ??跟羽夏學 Ghidra ——引用

      posted @ 2022-09-14 10:47  寂靜的羽夏  閱讀(4110)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲熟女乱一区二区三区| 不卡在线一区二区三区视频| 99精品人妻少妇一区| 亚洲人成网网址在线看| A毛片终身免费观看网站| 精品国产三级a∨在线欧美| 亚洲国产日韩一区三区| 国产精品亚洲二区在线看| 国产中文字幕精品视频| 亚洲成人av在线资源| 国产精品自拍视频第一页| 国产一级精品毛片基地| 男女无遮挡激情视频| 欧美日韩精品一区二区三区高清视频 | jlzz大jlzz大全免费| 亚洲欧美在线观看品| 欧美日韩免费专区在线观看| 摸丰满大乳奶水www免费| 欧美肥妇毛多水多bbxx| 激情四射激情五月综合网| 中文区中文字幕免费看| 一区二区中文字幕久久| 天堂v亚洲国产v第一次| 国产精品免费中文字幕| 日本熟妇人妻一区二区三区| 久久精品国产99精品亚洲| 99精品国产在热久久婷婷| 中文字幕乱码熟妇五十中出| 99久久久国产精品免费无卡顿| 国产精品久久久久久人妻精品| 亚洲精品国产熟女久久久| 亚洲男女一区二区三区| 十八禁午夜福利免费网站| 九九热在线精品视频首页| 免费现黄频在线观看国产| 鲁丝一区二区三区免费| 福利一区二区1000| 日韩丝袜欧美人妻制服| 精品无码国产自产拍在线观看蜜| 欧美人人妻人人澡人人尤物| 婷婷综合缴情亚洲|