歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

使用VC2017+IDA模擬復現CVE-2017-11882緩沖區溢出

來源:本站整理 作者:佚名 時間:2020-01-21 TAG: 我要投稿

緩沖區溢出是一種非常普遍的漏洞,廣泛存在于操作系統和各種應用軟件中。通過緩沖區溢出攻擊,可以完成執行非授權命令、執行惡意shellcode等高危攻擊操作。
在過往的緩沖區漏洞利用案例中,CVE-2017-11882是我印象比較深也是覺得比較有意思的一個。攻擊者只需給目標發送一個制作好的word文檔并且這個文檔被打開即可完成攻擊,夠簡單暴力。
這個漏洞竟然隱藏10余年后才被發現,驚嘆之余便有了一點小反思: 這樣的“漏洞代碼”作者倒底是如何寫出來的。
網上已經有很多關于11882的漏洞分析、復現的文章,本文從另外一個角度來復現: 通過VC寫一個小段程序,模擬展示這個緩沖區漏洞是如何產生和利用的。
演示代碼是兩年前寫的,想想還是該配上篇文章,混點Star好過年。本文適合于開發新手閱讀,需要一點基本的匯編和C基礎,大牛請飄過…
實驗效果
CVE-2017-11882的利用過程簡要概述如下,詳細分析文章可查閱本文末尾相關網頁
1.用Word打開一個包含攻擊代碼的Doc文檔
2.Word啟動公式編輯器組件EQNEDT32.EXE
3.EQNEDT32.EXE在處理OLE對象的數據流時發生溢出,跳轉 .text:00430C12 調用WinExec執行命令或shellcode
為模擬復現上述過程,編寫構造2個小程序和1個txt文檔,操作步驟如下:
Word應用軟件 -> OF-GUI.exe EQNEDT32.EXE ==> OF-Demo.exe Doc文檔 ==> txt文檔
1.用OF-GUI.exe打開txt文檔
2.OF-GUI.exe啟動OF-Demo.exe, 加載處理txt文檔
3.OF-Demo.exe發生溢出后,執行txt中的命令
實驗效果如下圖:

演示代碼下載:https://github.com/ekgg/Overflow-Demo-CVE-2017-11882
操作步驟
1、用IDA打開EQNEDT32.EXE,找開調用WinExec的那個函數sub_430C00

2、按F5轉為C代碼,

3、 在Visual Studio中創建一個控制臺程序工程,復制上面這個sub_430C00函數,微調一下,去掉無關代碼
    UINT sub_430C00(const char* lpCmdLine)
    {
        UINT result;
        char Buffer[256];
        result = WinExec(lpCmdLine, 1);
        if (result 32) //  1 = SW_NORMAL
        {
            FatalAppExit(0, TEXT("WinExec Failure"));
        }
        return result;
    }
4、 編寫一個典型的緩沖區溢出函數, 使用strcpy這個不安全拷貝函數,定義一個32字節的局部變量,傳入超過32字節的字符串,就會發生溢出
    void sub_ovdemo(char *buffer)
    {
        char stack_buf[32];//傳入超過32字節的字符串,就會發生溢出
        strcpy(stack_buf, buffer);         //  Disable Security Check (/GS-)
        DWORD bufsize = strlen(buffer);
        if (bufsize > 32)
        {
            printf("stack is overflow: %c", stack_buf[1]);
        }
        else
        {
            printf("%s", buffer);
        }
    }
5、 編譯工程后,在strcpy行設置斷點,啟動調試

如上圖直觀可見,進入sub_ovdemo函數代碼空間后,EBP=0X18FF04,
 * 紅色箭頭所指,ebp+8是調用sub_ovdemo的參數buffer
* ebp+4 = 0×00401096 (友情提示:低位在前高位在后)是函數ret時,跳轉的下一條指令的地址
* 綠色箭頭所指的32字節,就是局部變量 char stack_buf[32]的內存區域
到現在就很明了,只要構造一個32+4+4 = 40個字節的緩存,即可溢出覆蓋掉ebp+4 ,跳到想要達到的地方
6、在VS中或者用IDA查看上面的sub_430C00函數對WinExec的調用,可以得到想要跳轉的地址: 004010B3

因此用004010B3溢出覆蓋掉 上面的ebp+4 (00401096),即可達到用WinExec執行payload命令的目的。
7、 構造一個超過40字節的Txt, 使用16進制編輯器,寫溢出地址0x004010B3寫入txt中

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 网游之修罗传说黄色片段 信誉最高的棋牌游戏 东北麻将怎么算钱 天津泳坛夺金走势图 秒速牛牛稳赢技巧 577511王中王神算子 大唐棋牌游戏山西 北京麻将怎么玩 棋牌开元 云南手机麻将 怎么预测秒速快三 浙江体彩6十1基本走势图果 足球比分007即时比分网 篮球架报价 至尊单机下载 大乐透开奖结果走势图今天