国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++程序正向編譯逆向反編譯(一)

這篇具有很好參考價(jià)值的文章主要介紹了C++程序正向編譯逆向反編譯(一)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.需求

? ? ? ? 逆向工程師必須先是一個(gè)正向開發(fā)工程師,如果沒有C++/MFC的開發(fā)經(jīng)驗(yàn),就不會(huì)懂得如何逆向分析C++/MFC的程序,本文完成一個(gè)helloworld的C++正逆向過程。

2.C++程序源碼

? ? 編譯環(huán)境:visual studio 2022

#include <iostream>
#include <cstdlib>
using namespace std;


int main()
{
    int a;
    a = 100;
    for (int i = 0; i < a; i++)
    {
        cout << "Hello World! " << endl;
    }
    cin >> a;
    return 0;
    
}

編譯完畢后生成exe程序,導(dǎo)入Ghidra,分析完畢后,在symbol tree窗口,輸入main查找到主函數(shù)位置:

c++反編譯,物聯(lián)網(wǎng)信息安全,安全,網(wǎng)絡(luò)安全

3.反編譯結(jié)果

3.1 Ghidra反匯編

int __cdecl main(int _Argc,char **_Argv,char **_Env)

{
  basic_ostream<char,std::char_traits<char>_> *this;
  int iVar1;
  _RTC_framedesc *extraout_EDX;
  int *piVar2;
  code *pcVar3;
  int local_20 [4];
  int local_10 [2];
  uint local_8;
  
  piVar2 = local_20;
  for (iVar1 = 7; iVar1 != 0; iVar1 = iVar1 + -1) {
    *piVar2 = -0x33333334;
    piVar2 = piVar2 + 1;
  }
  local_8 = __security_cookie ^ (uint)&stack0xfffffffc;
  local_10[0] = 100;
                    /* static local (stored at 004124a0) <NoType> 
                       static local (stored at 00412494) <NoType> 
                       static local (stored at 0041248c) <NoType> 
                       static local (stored at 004124a0) <NoType> 
                       static local (stored at 00412494) <NoType> 
                       static local (stored at 0041248c) <NoType> */
  for (local_20[1] = 0; local_20[1] < local_10[0]; local_20[1] = local_20[1] + 1) {
    pcVar3 = std::endl<char,std::char_traits<char>_>;
    this = std::operator<<<std::char_traits<char>_>
                     ((basic_ostream<char,std::char_traits<char>_> *)cout_exref,"Hello World! ");
    std::basic_ostream<char,struct_std::char_traits<char>_>::operator<<
              ((basic_ostream<char,struct_std::char_traits<char>_> *)this,pcVar3);
    _RTC_CheckEsp();
  }
  std::basic_istream<char,struct_std::char_traits<char>_>::operator>>
            ((basic_istream<char,struct_std::char_traits<char>_> *)cin_exref,local_10);
  _RTC_CheckEsp();
  iVar1 = 0;
  _RTC_CheckStackVars((void *)0x0,extraout_EDX);
  __security_check_cookie(local_8 ^ (uint)&stack0xfffffffc);
  local_8 = 0x412487;
  _RTC_CheckEsp();
  return iVar1;
}

3.2 IDA 結(jié)果

int __cdecl main()
{
  std::ostream *v0; // eax
  int i; // [esp+D0h] [ebp-18h]
  int a; // [esp+DCh] [ebp-Ch] BYREF

  a = 100;
  for ( i = 0; i < a; ++i )
  {
    v0 = std::operator<<<std::char_traits<char>>(std::cout, "Hello World! ");
    std::ostream::operator<<(v0, std::endl<char,std::char_traits<char>>);
  }
  std::istream::operator>>(std::cin, &a);
  return 0;
}

4.Visual studio 里查看匯編代碼

在正向開發(fā)的過程中,可以在編譯器Visual studio里,查看C++代碼的匯編代碼,在程序中設(shè)置斷點(diǎn),F(xiàn)5編譯,等程序停住后,才有查看匯編選項(xiàng):

c++反編譯,物聯(lián)網(wǎng)信息安全,安全,網(wǎng)絡(luò)安全

?匯編代碼如下:

--- C:\Users\paul\source\repos\helloc++\helloc++\helloc++.cpp ------------------
     1: // helloc++.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
     2: //
     3: 
     4: #include <iostream>
     5: #include <cstdlib>
     6: using namespace std;
     7: 
     8: 
     9: int main()
    10: {
003F23D0 55                   push        ebp  
003F23D1 8B EC                mov         ebp,esp  
003F23D3 81 EC DC 00 00 00    sub         esp,0DCh  
003F23D9 53                   push        ebx  
003F23DA 56                   push        esi  
003F23DB 57                   push        edi  
003F23DC 8D 7D E4             lea         edi,[ebp-1Ch]  
003F23DF B9 07 00 00 00       mov         ecx,7  
003F23E4 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
003F23E9 F3 AB                rep stos    dword ptr es:[edi]  
003F23EB A1 04 C0 3F 00       mov         eax,dword ptr [__security_cookie (03FC004h)]  
003F23F0 33 C5                xor         eax,ebp  
003F23F2 89 45 FC             mov         dword ptr [ebp-4],eax  
    11:     int a;
    12:     a = 100;
003F23F5 C7 45 F4 64 00 00 00 mov         dword ptr [a],64h  
    13:     for (int i = 0; i < a; i++)
003F23FC C7 45 E8 00 00 00 00 mov         dword ptr [ebp-18h],0  
003F2403 EB 09                jmp         __$EncStackInitStart+32h (03F240Eh)  
003F2405 8B 45 E8             mov         eax,dword ptr [ebp-18h]  
003F2408 83 C0 01             add         eax,1  
003F240B 89 45 E8             mov         dword ptr [ebp-18h],eax  
003F240E 8B 45 E8             mov         eax,dword ptr [ebp-18h]  
003F2411 3B 45 F4             cmp         eax,dword ptr [a]  
003F2414 7D 2B                jge         __$EncStackInitStart+65h (03F2441h)  
    14:     {
    15:         cout << "Hello World! " << endl;
003F2416 8B F4                mov         esi,esp  
003F2418 68 3C 10 3F 00       push        offset std::endl<char,std::char_traits<char> > (03F103Ch)  
003F241D 68 30 9B 3F 00       push        offset string "Hello World! " (03F9B30h)  
003F2422 A1 DC D0 3F 00       mov         eax,dword ptr [__imp_std::cout (03FD0DCh)]  
003F2427 50                   push        eax  
003F2428 E8 7C ED FF FF       call        std::operator<<<std::char_traits<char> > (03F11A9h)  
003F242D 83 C4 08             add         esp,8  
003F2430 8B C8                mov         ecx,eax  
003F2432 FF 15 A8 D0 3F 00    call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (03FD0A8h)]  
003F2438 3B F4                cmp         esi,esp  
003F243A E8 50 EE FF FF       call        __RTC_CheckEsp (03F128Fh)  
    16:     }
003F243F EB C4                jmp         __$EncStackInitStart+29h (03F2405h)  
    17:     cin >> a;
003F2441 8B F4                mov         esi,esp  
003F2443 8D 45 F4             lea         eax,[a]  
003F2446 50                   push        eax  
003F2447 8B 0D 98 D0 3F 00    mov         ecx,dword ptr [__imp_std::cin (03FD098h)]  
003F244D FF 15 9C D0 3F 00    call        dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (03FD09Ch)]  
003F2453 3B F4                cmp         esi,esp  
003F2455 E8 35 EE FF FF       call        __RTC_CheckEsp (03F128Fh)  
    18:     return 0;
003F245A 33 C0                xor         eax,eax  
    19:     
    20: }
003F245C 52                   push        edx  
003F245D 8B CD                mov         ecx,ebp  
003F245F 50                   push        eax  
003F2460 8D 15 8C 24 3F 00    lea         edx,ds:[3F248Ch]  
003F2466 E8 C0 ED FF FF       call        @_RTC_CheckStackVars@8 (03F122Bh)  
003F246B 58                   pop         eax  
003F246C 5A                   pop         edx  
003F246D 5F                   pop         edi  
003F246E 5E                   pop         esi  
003F246F 5B                   pop         ebx  
003F2470 8B 4D FC             mov         ecx,dword ptr [ebp-4]  
003F2473 33 CD                xor         ecx,ebp  
003F2475 E8 02 ED FF FF       call        @__security_check_cookie@4 (03F117Ch)  
003F247A 81 C4 DC 00 00 00    add         esp,0DCh  
003F2480 3B EC                cmp         ebp,esp  
003F2482 E8 08 EE FF FF       call        __RTC_CheckEsp (03F128Fh)  
003F2487 8B E5                mov         esp,ebp  
003F2489 5D                   pop         ebp  
003F248A C3                   ret  
003F248B 90                   nop  
003F248C 01 00                add         dword ptr [eax],eax  
003F248E 00 00                add         byte ptr [eax],al  
003F2490 94                   xchg        eax,esp  
003F2491 24 3F                and         al,3Fh  
003F2493 00 F4                add         ah,dh  
003F2495 FF                   ?? ?????? 
003F2496 FF                   ?? ?????? 
    19:     
    20: }
003F2497 FF 04 00             inc         dword ptr [eax+eax]  
003F249A 00 00                add         byte ptr [eax],al  
003F249C A0 24 3F 00 61       mov         al,byte ptr ds:[61003F24h]  
003F24A1 00 CC                add         ah,cl  

5.小結(jié)

IDA反編譯的結(jié)果更接近源程序,因?yàn)?.讀取了pdb文件,2.不顯示參數(shù)檢查的反編譯代碼(?__security_cookie和_RTC_CheckStackVars等)。

5.1 什么是security cookie

并不是windows系統(tǒng)自帶的保護(hù)機(jī)制,并不是說一個(gè)確實(shí)存在溢出漏洞的程序,放到帶security cookie保護(hù)的環(huán)境中,就不能正常溢出了。其原理是在所有變量入棧前,多壓入一個(gè)變量(隨機(jī)數(shù)),然后函數(shù)執(zhí)行完之后,再去檢查這個(gè)數(shù)是不是一樣的,

5.2 什么是_RTC_CheckStackVars。

這也是一個(gè)編譯器行為,_RTC_CheckStackVars第一個(gè)參數(shù)是函數(shù)要檢查的棧頂?shù)刂?,第二個(gè)參數(shù)指向結(jié)構(gòu)體_RTC_framedesc。該結(jié)構(gòu)體第一個(gè)參數(shù)是壓棧的局部變量個(gè)數(shù),第二個(gè)參數(shù)保存局部變量相關(guān)信息。分別是變量的棧偏移地址,變量大小和變量的名字。因此我們可以通過地址跳轉(zhuǎn)最終找到出錯(cuò)的變量文章來源地址http://www.zghlxwxcb.cn/news/detail-798672.html

到了這里,關(guān)于C++程序正向編譯逆向反編譯(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 機(jī)械臂正向與逆向運(yùn)動(dòng)學(xué)求解

    機(jī)械臂正向與逆向運(yùn)動(dòng)學(xué)求解

    ????????機(jī)械臂的正運(yùn)動(dòng)學(xué)求解即建立DH參數(shù)表,然后計(jì)算出各變換矩陣以及最終的變換矩陣。逆運(yùn)動(dòng)學(xué)求解,即求出機(jī)械臂各關(guān)節(jié)θ角與px,py,pz的關(guān)系,建立θ角與末端姿態(tài)之間的數(shù)學(xué)模型,在這里以IRB6700為例,對(duì)IRB6700進(jìn)行正逆運(yùn)動(dòng)學(xué)求解和驗(yàn)證。 目錄 正運(yùn)動(dòng)學(xué)求解 逆

    2023年04月10日
    瀏覽(42)
  • Linux C++性能優(yōu)化秘籍:從編譯器到代碼,探究高性能C++程序的實(shí)現(xiàn)之道

    Linux C++性能優(yōu)化秘籍:從編譯器到代碼,探究高性能C++程序的實(shí)現(xiàn)之道

    隨著大數(shù)據(jù)、人工智能等技術(shù)的飛速發(fā)展,程序性能優(yōu)化的重要性愈發(fā)突出。優(yōu)化性能可以降低資源消耗、提高系統(tǒng)響應(yīng)速度,從而在有限的硬件資源下,實(shí)現(xiàn)更高的吞吐量和處理能力。此外,性能優(yōu)化也有助于降低能耗、減少散熱問題,延長硬件使用壽命。 Linux操作系統(tǒng)具

    2023年04月09日
    瀏覽(47)
  • 在C++中控制調(diào)試信息的輸出通常通過預(yù)處理指令(如 #define)和條件編譯指令(如 #ifdef、#ifndef、#endif)來實(shí)現(xiàn)。

    在C++中,控制調(diào)試信息的輸出通常通過預(yù)處理指令(如 #define )和條件編譯指令(如 #ifdef 、 #ifndef 、 #endif )來實(shí)現(xiàn)。這種方法提供了一種靈活的方式來包含或排除調(diào)試代碼,而無需對(duì)代碼本身進(jìn)行大量修改。以下是實(shí)現(xiàn)這一功能的一種常見方法: 定義一個(gè)宏用于控制調(diào)試

    2024年02月02日
    瀏覽(23)
  • vscode開發(fā)c++ 程序,配置使用微軟自家的cl編譯器。

    vscode開發(fā)c++ 程序,配置使用微軟自家的cl編譯器。

    vscode 寫c++代碼, 配置為使用微軟自己的cl編譯器: 1.安裝visual studio 2022, 并且創(chuàng)建一個(gè)可以正常編譯的cpp工程。 2. 從visual studio 2022的菜單 項(xiàng)目 屬性,查出include和lib的配置信息,并錄入到window的系統(tǒng)環(huán)境變量中,當(dāng)然還要把cl可執(zhí)行文件的路徑也錄入到window11系統(tǒng)PATH中,如下

    2024年03月19日
    瀏覽(34)
  • 分詞算法----正向和逆向最大匹配算法(含Python代碼實(shí)現(xiàn))

    分詞算法----正向和逆向最大匹配算法(含Python代碼實(shí)現(xiàn))

    分詞算法(Segmentation Method) 在文本處理流程中,對(duì)語句進(jìn)行分詞(Segmentation)操作對(duì)于計(jì)算機(jī)認(rèn)識(shí)并理解人類語言是基礎(chǔ)且重要的。 對(duì)于中文來講,不同于英文直接采用空格符進(jìn)行分隔,并且中文詞語內(nèi)涵豐厚,語義豐富,所以只有采用合適的分詞算法,才能準(zhǔn)確迅速地向計(jì)

    2024年03月25日
    瀏覽(26)
  • 利用逆向工具反編譯溯源小程序

    利用逆向工具反編譯溯源小程序

    以下為逆向過程工具,下載后無需安裝直接使用。 逆向工具使用的是:wxappUnpacker 解密工具使用的是以上工具包中的: 使用PC版微信客戶端的小程序模塊,查找客戶端的文件保存目錄 Applet目錄即為存放小程序編譯包的路徑。如果此目錄下有多個(gè)文件夾無法區(qū)分建議把wx開頭的

    2024年04月13日
    瀏覽(32)
  • 微信小程序逆向反編譯獲取源碼

    微信小程序逆向反編譯獲取源碼

    node環(huán)境 node官網(wǎng) 微信開發(fā)者工具 下載地址 小程序包 逆向工具 GitHub UnpackMiniApp.exe 解密小程序包工具 wxpack 存放解密后的小程序包(.wxapkg文件)與小程序源碼文件(與小程序包同名) Unpacker 反編譯腳本,將解密后的小程序包(.wxapkg文件)反編譯為小程序源碼文件 博客:原地

    2024年02月20日
    瀏覽(35)
  • 滴水逆向三期筆記與作業(yè)——02C語言——05 正向基礎(chǔ)/05 循環(huán)語句

    滴水逆向三期筆記與作業(yè)——02C語言——05 正向基礎(chǔ)/05 循環(huán)語句

    原理:arr[5]是ebp的位置,而arr[6]是ebp+0x4的位置,即函數(shù)的返回地址,賦值給arr[6]相當(dāng)于是修改了eip寄存器。 反匯編:i等于7時(shí),修改了rbp+0x1c-0x20即rbp-0x4位置的值,將其置為0,而該位置為i的值,所以每一輪for過后將i重新置0,就造成了不停的循環(huán)。 聲明一個(gè)變量就是告訴計(jì)

    2024年02月15日
    瀏覽(24)
  • 微信小程序 Spdier - OfferShow 反編譯逆向(一)

    微信小程序 Spdier - OfferShow 反編譯逆向(一)

    本文需要使用到的工具有: Charles抓包工具、夜神模擬器、微信開發(fā)者工具、wxapkg反編譯工具CrackMinApp; 提示:需要安裝好Charles和夜神模擬器并配置好App抓包環(huán)境,以及安裝好微信開發(fā)者工具 / 反編譯工具CrackMinApp Charles夜神模擬器安裝教程:https://blog.csdn.net/EXIxiaozhou/article

    2024年01月17日
    瀏覽(21)
  • Clion配置C++程序用Android NDK編譯,并用真機(jī)遠(yuǎn)程調(diào)試(臨時(shí)目錄和termux)

    Clion配置C++程序用Android NDK編譯,并用真機(jī)遠(yuǎn)程調(diào)試(臨時(shí)目錄和termux)

    :ndk, clion, cmake, usb, tcp, ssh, remote debug, remote gdb debug, termux, tabby 假設(shè)已經(jīng)有了一個(gè)在windows下能正常編譯運(yùn)行的C++控制臺(tái)程序,本文僅說明如何在windows下交叉編譯到android并調(diào)試。C++庫類似。 要點(diǎn)提示: 對(duì)于unity用戶,建議用unity 2022自帶的 ndk r23 。理論上可以用新版,但

    2024年02月21日
    瀏覽(72)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包