成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

慎點!來自反編譯器的危險

安全 移動安全
只需要在編譯過后的機(jī)器代碼中使用反編譯器的功能就可以把機(jī)器代碼嘗試恢復(fù)到近似于軟件以前的源代碼級別。在這篇文章中,我將探討一些和反編譯器相關(guān)的破壞或有目的性地會誤導(dǎo)逆向工程師的反反編譯技術(shù)。

在以前的時代,對軟件來進(jìn)行下(匯編級)逆向工程確實是一個很繁瑣的過程,但是如今現(xiàn)代反編譯器的發(fā)展已經(jīng)把這個過程變得容易了。只需要在編譯過后的機(jī)器代碼中使用反編譯器的功能就可以把機(jī)器代碼嘗試恢復(fù)到近似于軟件以前的源代碼級別。

反編譯器

不可否認(rèn)的是,支持反匯編功能的反編譯器的這種技術(shù)它背后的科學(xué)和便利性是很值得贊賞的。就像這樣,在點擊功能選項時,一個完完全全的新手可以將難懂的“機(jī)器代碼”轉(zhuǎn)換成人類可讀的代碼,然后就能上手逆向工程了,你說,驚不驚訝?

然而現(xiàn)實情況是,安全研究人員也越來越依賴于這些技術(shù),雖然工欲善其事必先利其器這句話沒錯,但是越依賴工具,這將使我們更加地暴露在這些工具的不完善之處。在這篇文章中,我將探討一些和反編譯器相關(guān)的破壞或有目的性地會誤導(dǎo)逆向工程師的反反編譯技術(shù)。

Positive SP Value

第一種技術(shù)是能破壞Hex-Rays反編譯器的經(jīng)典方法,在IDA Pro中,如果在返回之前沒有清理堆棧分配(平衡堆棧指針),則反編譯器將拒絕反編譯該函數(shù)。

這樣的情況一般是程序代碼有一些干擾代碼,讓IDA的反匯編分析出現(xiàn)錯誤。比如用push + n條指令 + retn來實際跳轉(zhuǎn),而IDA會以為retn是函數(shù)要結(jié)束,結(jié)果它分析后發(fā)現(xiàn)調(diào)用棧不平衡,因此就提示sp analysis failed。

來自反編譯器的危險

例如當(dāng)IDA無法合理地構(gòu)造出某些函數(shù)調(diào)用時的定義類型時偶爾也會發(fā)生這種情況,作為反反編譯技術(shù),開發(fā)人員可以通過使用一些特殊的手法來破壞堆棧指針的平衡,以此誘導(dǎo)逆向者來出現(xiàn)這些效果。

  1. // 
  2.  
  3. // compiled on Ubuntu 16.04 with: 
  4.  
  5. //    gcc -o predicate predicate.c -masm=intel 
  6.  
  7. // 
  8.  
  9. #include <stdio.h> 
  10.  
  11. #define positive_sp_predicate \ 
  12.  
  13.     __asm__ ("  push     rax      \n"\ 
  14.  
  15.              "  xor      eax, eax \n"\ 
  16.  
  17.              "  jz       opaque   \n"\ 
  18.  
  19.              "  add      rsp, 4   \n"\ 
  20.  
  21.              "opaque:             \n"\ 
  22.  
  23.              "  pop      rax      \n"); 
  24.  
  25. void protected() 
  26.  
  27.  
  28.     positive_sp_predicate; 
  29.  
  30.     puts("Can't decompile this function"); 
  31.  
  32.  
  33. void main() 
  34.  
  35.  
  36.     protected(); 
  37.  

上面定義add rsp, 4的positive_sp_predicate宏中的指令永遠(yuǎn)不會在運(yùn)行時被執(zhí)行,但是它會使IDA進(jìn)行反編譯時的靜態(tài)分析失敗。當(dāng)試圖反編譯protected()提供的生成函數(shù)會產(chǎn)生以下結(jié)果:

當(dāng)試圖反編譯protected()提供的生成函數(shù)會產(chǎn)生以下結(jié)果

這種技術(shù)是比較有名的,可以通過修補(bǔ)缺陷來修復(fù),也可以通過手動修正堆棧偏移值來修復(fù)。

在MBE中,有使用這種技術(shù)作為一個簡單的技巧來阻止新手逆向工程師(例如學(xué)生)來進(jìn)行反匯編并能直接讓反編譯器輸出軟件的源代碼來。

返回型劫持

現(xiàn)代反編譯器希望的是能準(zhǔn)確地識別和抽象出編譯器生成的低級的能記錄的邏輯信息,例如功能的開頭/結(jié)尾或能控制的流(元)數(shù)據(jù)部分。

返回型劫持

反編譯器力圖從輸出中來省略這些信息,因為保存這些寄存器或管理堆棧幀分配的任務(wù)并不會在反編譯器輸出軟件源代碼時得到執(zhí)行。

這些遺漏(或者是Hex-Rays反編譯器啟發(fā)式方法中的一個缺陷)的一個有趣的地方是我們可以在函數(shù)返回之前來“移動”棧,使得反編譯器不發(fā)出警告或者也不顯示任何帶有惡意的指示。

Stack pivot 是二進(jìn)制開發(fā)中常用的技術(shù),可以實現(xiàn)任意的ROP。在這種情況下,我們(作為開發(fā)人員)使用它作為一種手段,來從不知情的逆向工程師手中劫持到執(zhí)行權(quán)。可以說,那些專注于反編譯器輸出結(jié)果的人肯定不會注意到它,哈哈。

返回型劫持

我們把這個堆棧轉(zhuǎn)換成一個很小的ROP鏈,這個鏈已經(jīng)被編譯成二進(jìn)制文件來執(zhí)行這個錯誤操作了。最終結(jié)果是一個對反編譯器“不可見”的函數(shù)調(diào)用。圖中我們調(diào)用函數(shù)的目的只是打印出“惡意代碼”來證明它已經(jīng)被執(zhí)行。

 利用返回劫持反編譯技術(shù)執(zhí)行編譯后的二進(jìn)制文件

圖: 利用返回劫持反編譯技術(shù)執(zhí)行編譯后的二進(jìn)制文件

用于演示這種從反編譯器中隱藏代碼的技術(shù)的代碼可以在下面找到

  1. // 
  2.  
  3. // compiled on Ubuntu 16.04 with: 
  4.  
  5. //    gcc -o return return.c -masm=intel 
  6.  
  7. // 
  8.  
  9. #include <stdio.h> 
  10.  
  11. void evil() { 
  12.  
  13.     puts("Evil Code"); 
  14.  
  15.  
  16. extern void gadget(); 
  17.  
  18. __asm__ (".global gadget        \n" 
  19.  
  20.          "gadget:               \n" 
  21.  
  22.          "  pop       rax       \n" 
  23.  
  24.          "  mov       rsp, rbp  \n" 
  25.  
  26.          "  call      rax       \n" 
  27.  
  28.          "  pop       rbp       \n" 
  29.  
  30.          "  ret                 \n"); 
  31.  
  32. void * gadgets[] = {gadget, evil}; 
  33.  
  34. void deceptive() { 
  35.  
  36.     puts("Hello World!"); 
  37.  
  38.     __asm__("mov rsp, %0;\n" 
  39.  
  40.             "ret" 
  41.  
  42.             : 
  43.  
  44.             :"i" (gadgets)); 
  45.  
  46.  
  47. void main() { 
  48.  
  49.     deceptive(); 
  50.  

濫用 ‘noreturn’ 函數(shù)

我們將介紹的最后一個技巧是利用IDA的自動感知功能將函數(shù)標(biāo)記為noreturn,因為每一個的noreturn函數(shù)將會表示為從標(biāo)準(zhǔn)庫來的exit()或者abort()這些函數(shù)。

在生成給定函數(shù)的偽代碼時,反編譯器會在調(diào)用noreturn函數(shù)后丟棄任何代碼。能預(yù)計到的是即使使用的是exit()函數(shù),對于其他任何一個函數(shù)它都不會返回并繼續(xù)執(zhí)行代碼。

圖:直接在調(diào)用noreturn函數(shù)之后的代碼對于反編譯器是不可見的

如果惡意攻擊者可以欺騙IDA讓它相信一個函數(shù)是noreturn,但實際上這個函數(shù)它并不是noreturn的時候,那么這個惡意行為者可以悄悄地將惡意代碼隱藏起來。

下面的例子演示了我們可以通過多種方法實現(xiàn)這個效果。

  1. // 
  2.  
  3. // compiled on Ubuntu 16.04 with: 
  4.  
  5. //    gcc -o noreturn noreturn.c 
  6.  
  7. // 
  8.  
  9. #include <stdio.h> 
  10.  
  11. #include <stdlib.h> 
  12.  
  13. void ignore() { 
  14.  
  15.     exit(0);                  // force a PLT/GOT entry for exit() 
  16.  
  17.  
  18. void deceptive() { 
  19.  
  20.     puts("Hello World!"); 
  21.  
  22.     srand(0);                 // post-processing will swap srand() <--> exit() 
  23.  
  24.     puts("Evil Code"); 
  25.  
  26.  
  27. void main() { 
  28.  
  29.     deceptive(); 
  30.  

通過編譯上面的代碼,并根據(jù)生成的二進(jìn)制文件運(yùn)行一個簡短的基于二進(jìn)制的后期處理腳本,我們可以在過程連接表中交換推送的序號。這些索引用于軟件在運(yùn)行時解析庫的導(dǎo)入。

在這個例子中,我們交換了srand()與exit()的序號。因此,IDA認(rèn)為deceptive()修改后的二進(jìn)制文件中的exit()的noreturn函數(shù)才是調(diào)用函數(shù),而srand()不是調(diào)用函數(shù)。

我們在IDA中看到exit()被調(diào)用,而srand()在運(yùn)行,事實上srand()是不可控的。對反編譯器的影響程度幾乎與上一節(jié)所描述的返回劫持技術(shù)相同。運(yùn)行的二進(jìn)制文件表明我們的“惡意代碼”也正在執(zhí)行,而反編譯器對此卻并不知情。

雖然在這些例子中存在惡意代碼,但將這些技術(shù)使用在具有更大的功能和復(fù)雜的條件下時,將使得它們非常容易上手,并造成更大危害。

結(jié)論

反編譯器是一個令人印象很深刻但卻又不完善的技術(shù)。它在不完整的信息上來進(jìn)行一些操作,盡其所能地來輸出接近于我們認(rèn)知的軟件源代碼。惡意行為者同時可以(也將會)利用這些不對稱的技術(shù)手段來作為欺騙手法去對用戶進(jìn)行一些惡意攻擊(行為)。

隨著行業(yè)越來越依賴于反編譯器(工具),反反編譯技術(shù)的采用將會與反調(diào)試一樣地快速增加和發(fā)展起來,謝謝閱讀。

責(zé)任編輯:趙寧寧 來源: FreeBuf
相關(guān)推薦

2024-04-07 00:00:00

.NETILSpy操作指南

2010-12-21 10:16:53

2010-03-23 11:17:16

Python 動態(tài)編譯

2010-10-20 13:43:37

C++編譯器

2022-05-18 09:31:42

編譯器開源代碼生成

2019-06-20 09:00:00

.NETIDE代碼編輯器

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-01-12 16:42:59

C++編譯器

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2020-11-13 13:05:27

Java開發(fā)代碼

2015-01-15 11:01:43

2010-01-14 16:46:13

CentOS Mysq

2019-08-06 08:20:07

編譯器工具開發(fā)者

2010-02-02 17:08:26

Python靜態(tài)編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

2010-03-02 10:55:47

Linux SkyEy

2011-05-18 11:06:25

java編譯器
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人综合视频在线 | 成人毛片网 | 国产日韩欧美精品一区二区三区 | 天啪| 久久丝袜 | 亚洲精品一区二区网址 | 日韩精品免费 | 黄视频网址 | 午夜小电影 | 国产成人99久久亚洲综合精品 | 精品一区二区三区入口 | 亚洲女人天堂网 | 国产美女一区二区 | 国产欧美一区二区三区久久人妖 | 成年人在线观看视频 | 超级乱淫av片免费播放 | 国产乱精品一区二区三区 | 免费国产视频 | 日本不卡高字幕在线2019 | 成人一区二区视频 | 美女黄网站 | 精品少妇一区二区三区日产乱码 | 在线视频a | 天天干天天爱天天操 | 国产免费一区二区 | 亚洲精品在线看 | 视频一二三区 | 99只有精品 | 精品在线一区 | 成人精品鲁一区一区二区 | 亚洲精品一区二区在线观看 | 免费看黄视频网站 | 产真a观专区 | 亚洲精品播放 | 亚洲精品福利在线 | 欧美黄色一区 | 综合亚洲视频 | 日韩欧美一区在线 | 中文字幕av亚洲精品一部二部 | av大片| 亚洲天堂精品久久 |