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

代碼混淆與反混淆學(xué)習(xí)-第二彈

這篇具有很好參考價值的文章主要介紹了代碼混淆與反混淆學(xué)習(xí)-第二彈。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

deflat 腳本學(xué)習(xí)【去除OLLVM混淆】

deflat腳本鏈接:GitHub - cq674350529/deflat: use angr to deobfuscation

deflat 腳本測試

這里以代碼混淆與反混淆學(xué)習(xí)-第一彈中的OLLVM 混淆樣本為例進(jìn)行去除?!綥LVM-4.0】

控制流平坦前 控制流平坦后
代碼混淆與反混淆學(xué)習(xí)-第二彈 代碼混淆與反混淆學(xué)習(xí)-第二彈

python deflat.py --file main-bcf --addr 0x401180

代碼混淆與反混淆學(xué)習(xí)-第二彈

代碼混淆與反混淆學(xué)習(xí)-第二彈

deflat.py 成功去除后效果:

代碼混淆與反混淆學(xué)習(xí)-第二彈 代碼混淆與反混淆學(xué)習(xí)-第二彈

去混淆后,效果還算可以,能分析程序流程了。

deflat 腳本分析【angr】

利用符號執(zhí)行去除控制流平坦化 - 博客 - 騰訊安全應(yīng)急響應(yīng)中心 (tencent.com)

angr documentation

利用angr符號執(zhí)行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io)

代碼混淆與反混淆學(xué)習(xí)-第二彈

  • 序言:函數(shù)的第一個執(zhí)行的基本塊
  • 主(子)分發(fā)器:控制程序跳轉(zhuǎn)到下一個待執(zhí)行的基本塊
  • retn塊:函數(shù)出口
  • 真實塊:混淆前的基本塊,程序真正執(zhí)行工作的版塊
  • 預(yù)處理器:跳轉(zhuǎn)到主分發(fā)器

如第一彈中分析:OLLVM 的控制流平坦化是將程序的一般邏輯劃分為很多個真實執(zhí)行的塊,然后通過分發(fā)器進(jìn)行鏈接。其實就是一個Switch結(jié)構(gòu),每次執(zhí)行完真實塊后,進(jìn)行預(yù)處理,再跳轉(zhuǎn)到主分發(fā)器,繼續(xù)分發(fā),最終達(dá)到平坦化的效果。

顯然,去控制流平坦化就是要找到真實塊間的跳轉(zhuǎn)邏輯,打破Switch結(jié)構(gòu)束縛。

具體來說,有如下步驟:

  1. 靜態(tài)分析CFG得到序言/入口塊、主分發(fā)器、子分發(fā)器/無用塊、真實塊、預(yù)分發(fā)器和返回塊。
  2. 利用符號執(zhí)行恢復(fù)真實塊的前后關(guān)系,重建控制流
  3. 根據(jù)第二步重建的控制流Patch程序,輸出恢復(fù)后的可執(zhí)行文件

靜態(tài)分析

首先明確:【以下結(jié)論針對OLLVM項目,其他大佬加料的OLLVM混淆還需要單獨分析】

  1. 函數(shù)的開始地址為序言的地址
  2. 序言的后繼為主分發(fā)器
  3. 后繼為主分發(fā)器的塊為預(yù)處理器
  4. 后繼為預(yù)處理器的塊為真實塊
  5. 無后繼的塊為retn塊
  6. 剩下的為無用塊

angr 獲取類似Ida的 CFG

代碼混淆與反混淆學(xué)習(xí)-第二彈

獲取真實塊、主分發(fā)器、預(yù)處理器、序言、retn塊和無用塊

代碼混淆與反混淆學(xué)習(xí)-第二彈

獲取真實塊的細(xì)節(jié)

代碼混淆與反混淆學(xué)習(xí)-第二彈

angr 恢復(fù)真實塊執(zhí)行邏輯,重建控制流

利用angr 強(qiáng)大的符號執(zhí)行功能,找到各真實塊的連接邏輯。

代碼混淆與反混淆學(xué)習(xí)-第二彈

這里對于兩個分支的模擬執(zhí)行,只需關(guān)注cmov指令,就可以分別對應(yīng)得到eax、ecx,然后獲得后續(xù)真實塊?!揪窒扌院艽蟆?/p>

代碼混淆與反混淆學(xué)習(xí)-第二彈

符號執(zhí)行 symbolic_execution()函數(shù),返回后繼真實塊。

代碼混淆與反混淆學(xué)習(xí)-第二彈

Patch程序恢復(fù)執(zhí)行邏輯

代碼混淆與反混淆學(xué)習(xí)-第二彈

如此便完成了 deflat腳本的簡單處理分析。

小結(jié)

分析下來,其實就是定位到所有真實塊,然后利用angr符號執(zhí)行將真實塊間的執(zhí)行邏輯進(jìn)行串聯(lián)。最后進(jìn)行patch程序,重建控制流。

但顯然存在一些問題,我們默認(rèn)了如下規(guī)則:

  1. 函數(shù)的開始地址為序言的地址
  2. 序言的后繼為主分發(fā)器
  3. 后繼為主分發(fā)器的塊為預(yù)處理器
  4. 后繼為預(yù)處理器的塊為真實塊
  5. 無后繼的塊為retn塊
  6. 剩下的為無用塊

但是在實際去除控制流平坦化過程中,上面的默認(rèn)思路已經(jīng)被加混淆的開發(fā)者做了處理。

例如:

  • 后繼為預(yù)處理器的塊不一定是真實塊;
  • 預(yù)處理器不一定存在;
  • 存在分支的真實塊跳轉(zhuǎn)的判斷邏輯,不一定是cmov指令;
  • deflat腳本默認(rèn)模擬執(zhí)行最多兩個分支,但真實情況可能不只兩個分支;
  • 可能存在一個向前更新的數(shù)組,依據(jù)程序運(yùn)行進(jìn)行更新,決定當(dāng)前真實塊的跳轉(zhuǎn)【這導(dǎo)致angr對于該塊的模擬執(zhí)行得不到正確的跳轉(zhuǎn)】
  • 程序在加混淆前,已經(jīng)被添加了花指令或其他處理,程序CFG圖已經(jīng)被打破;
  • 某個塊存在死循環(huán),會使angr符號執(zhí)行卡死……

這也導(dǎo)致了,這個deflat腳本的普適性較低,除了能夠處理OLLVM官方項目做的混淆,對加了其他PASS或者處理的混淆,基本用不了。

所以對于去除不了的OLLVM混淆,我們需要根據(jù)程序的實際混淆效果,對deflat腳本進(jìn)行修改,再進(jìn)行去混淆。

【這也要求對deflat 腳本比較熟悉,可以更快上手】

失敗的花指令控制流平坦化嘗試

使用代碼混淆與反混淆學(xué)習(xí)-第一彈中加了花指令的程序,進(jìn)行OLLVM控制流平坦化混淆,看看效果。

源代碼如下:

代碼混淆與反混淆學(xué)習(xí)-第二彈

# clang 執(zhí)行內(nèi)聯(lián)匯編加 -fasm-blocks 或者 -fms-extensions 或者 -masm=intel

clang -mllvm -fla -mllvm -split -mllvm -split_num=3 main-call-加花.cpp -lm -fasm-blocks -o main-call-加花

# 需要對源代碼作一些修改

存在較大的問題,我的OLLVM 環(huán)境是在Ubuntu上搭建的,對于上述內(nèi)聯(lián)匯編加的花指令無法編譯通過!

【或許可以在Windows 上移植OLLVM,進(jìn)行編譯(好像挺難的)

代碼混淆與反混淆學(xué)習(xí)-第二彈

可以看到,花指令用到的標(biāo)簽、$ 出現(xiàn)報錯。

【最終也沒解決編譯問題,或許本就不可以,ollvm 不具備這樣的處理能力,也可能是我代碼的問題,如果博客前的你有任何想法,歡迎與我交流

TSCTF-J 2022-upx_revenge實戰(zhàn)分析

TSCTF-J 2022 WP

upx_revenge題目進(jìn)行分析。

代碼混淆與反混淆學(xué)習(xí)-第二彈

首先直接使用deflat 腳本。

python deflat.py --file upx_revenge_test --addr 0x4016D0

代碼混淆與反混淆學(xué)習(xí)-第二彈

發(fā)現(xiàn)沒有找到retn 塊。

處理多個retn塊

回到ida 查看cfg 圖發(fā)現(xiàn)原因:存在其他的退出塊。

代碼混淆與反混淆學(xué)習(xí)-第二彈

這里需要改進(jìn)deflat 腳本,使其存在很多retn塊。

# 其他位置的retn_node,對應(yīng)改為list處理
if supergraph.out_degree(node) == 0:
            retn_node.append(node)

代碼混淆與反混淆學(xué)習(xí)-第二彈

成功運(yùn)行,但是去除效果不行。

去除后CFG圖
代碼混淆與反混淆學(xué)習(xí)-第二彈

多個comv的處理

很明顯看出,程序的真實塊間的邏輯串聯(lián)失敗,也就是重建控制流失敗。

代碼混淆與反混淆學(xué)習(xí)-第二彈

產(chǎn)生原因

代碼混淆與反混淆學(xué)習(xí)-第二彈
代碼混淆與反混淆學(xué)習(xí)-第二彈

顯然,這里存在2個分支,因為有兩個cmov【相同判斷】,并且call 函數(shù),對分支跳轉(zhuǎn)是有作用的,這里var_CC是順序執(zhí)行,動態(tài)更新的。

【deflat 腳本只處理了執(zhí)行有一個cmov指令的情況,且hook了call函數(shù)】

【由于var_CC是順序執(zhí)行,動態(tài)更新也可以看出,deflat 腳本的模擬執(zhí)行思路已經(jīng)無法對真實塊的后繼進(jìn)行確定了】

但這里做個測試,不hook call 看是什么效果。

代碼混淆與反混淆學(xué)習(xí)-第二彈

可以知道,取消hook call 對真實塊后繼的查找毫無影響,這是因為deflat中的模擬執(zhí)行,只是基于comv 處的模擬。對前文并無任何關(guān)聯(lián)。

顯然,該deflat腳本的無法處理了?!尽?/p>

總結(jié)

angr

upx_revenge 這道題而言,

deflat 腳本中angr 對局部的模擬執(zhí)行顯然無法獲取真實塊間的執(zhí)行順序,重建控制流顯然也無從談起。當(dāng)然靜態(tài)查找各個控制流平坦化的功能塊效果還是可以的。

那么如何通過angr,有序的、聯(lián)系上文地進(jìn)行模擬執(zhí)行,獲取真實塊的執(zhí)行邏輯,顯然是關(guān)鍵點!

【??? 后續(xù)學(xué)習(xí)了,有思路再更新】

unicorn

[原創(chuàng)]ARM64 OLLVM反混淆-Android安全-看雪論壇-安全社區(qū)|安全招聘|bbs.pediy.com (kanxue.com)

Unicorn反混淆:恢復(fù)被OLLVM保護(hù)的程序(一) - 簡書 (jianshu.com)

使用unicorn 模擬執(zhí)行框架獲取真實塊間的執(zhí)行順序,重建控制流。

【還沒學(xué)過 unicorn 使用,,,】

ida

使用IDA microcode去除ollvm混淆(上) - 先知社區(qū) (aliyun.com)

GitHub - PShocker/de-ollvm: IDA Python Script for anti ollvm

利用ida 現(xiàn)成的CFG 圖,以及idc 腳本,動態(tài)運(yùn)行程序,獲取真實塊的執(zhí)行順序,從而恢復(fù)控制流。文章來源地址http://www.zghlxwxcb.cn/news/detail-408776.html

到了這里,關(guān)于代碼混淆與反混淆學(xué)習(xí)-第二彈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • PMP練習(xí)題 第二彈

    一個多階段項目發(fā)起人離開公司,項目文件已獲得批準(zhǔn)并滿足其目標(biāo)。資源預(yù)算已到位。項目經(jīng)理接下來應(yīng)該怎么做? A:在離開組織的發(fā)起人的主管同意下,評估項目的持續(xù)需求 B:立即開始項目收尾過程 C:檢查與商業(yè)論證的符合性 D:延遲重新評估,直至項目結(jié)束且資金

    2024年02月07日
    瀏覽(20)
  • Python 基礎(chǔ)面試第二彈

    在Python中,面向?qū)ο缶幊蹋∣bject-Oriented Programming,簡稱OOP)是一種編程范式,它將數(shù)據(jù)和操作數(shù)據(jù)的方法組織在一起,形成對象。面向?qū)ο蟮木幊讨饕獓@著類(Class) 和對象(Object)展開,通過封裝、繼承和多態(tài)等概念,實現(xiàn)代碼的重用性、可維護(hù)性和可擴(kuò)展性。 Python中的

    2024年02月11日
    瀏覽(18)
  • C++第二彈---C++入門(中)

    C++第二彈---C++入門(中)

    ? 個人主頁: ? 熬夜學(xué)編程的小林 ?? 系列專欄: ? 【C語言詳解】 ? 【數(shù)據(jù)結(jié)構(gòu)詳解】 【C++詳解】 C++入門 1、函數(shù)重載 1.1、函數(shù)重載概念 1.2、C++支持函數(shù)重載的原理--名字修飾(name Mangling) 3、引用 3.1、引用概念 3.2、引用特性 3.3、常引用 3.4、使用場景 3.5、傳值、傳引用

    2024年03月14日
    瀏覽(55)
  • 力扣刷MySQL-第二彈(詳細(xì)解析)

    力扣刷MySQL-第二彈(詳細(xì)解析)

    ???歡迎您來到我的MySQL基礎(chǔ)復(fù)習(xí)專欄 ☆* o(≧▽≦)o *☆哈嘍~我是小小惡斯法克?? ?博客主頁:小小惡斯法克的博客 ??該系列文章專欄:力扣刷題講解-MySQL ??文章作者技術(shù)和水平很有限,如果文中出現(xiàn)錯誤,希望大家能指正?? ?? 感謝大家的關(guān)注!??? 目錄 ??查找重

    2024年01月18日
    瀏覽(15)
  • 數(shù)據(jù)庫基礎(chǔ)面試第二彈

    樂觀鎖和悲觀鎖是在并發(fā)編程中使用的兩種并發(fā)控制機(jī)制,用于解決多線程或多進(jìn)程環(huán)境下的數(shù)據(jù)一致性問題。 1. 悲觀鎖 (Pessimistic Locking): 悲觀鎖的思想是假設(shè)并發(fā)訪問會導(dǎo)致沖突,因此在訪問共享資源之前,悲觀鎖會將資源鎖定,確保其他線程無法修改資源。悲觀鎖的

    2024年02月10日
    瀏覽(22)
  • 計算機(jī)網(wǎng)絡(luò) 基礎(chǔ)面試第二彈

    TCP三次握手的過程如下: 第一步(SYN):客戶端向服務(wù)器發(fā)送一個帶有SYN(同步)標(biāo)志的TCP包,指示客戶端希望建立連接。這個包包含一個隨機(jī)的初始序列號(ISN)。 第二步(SYN-ACK):服務(wù)器收到客戶端的SYN包后,會發(fā)送一個帶有SYN和ACK(確認(rèn))標(biāo)志的TCP包作為回應(yīng)。服務(wù)

    2024年02月08日
    瀏覽(19)
  • 習(xí)題練習(xí) C語言(暑期第二彈)

    習(xí)題練習(xí) C語言(暑期第二彈)

    重要的事說三遍! 學(xué)習(xí)!學(xué)習(xí)!學(xué)習(xí)! 對于代碼段,下面描述正確的是( ) A: 其中循環(huán)控制表達(dá)式與0等價 B: 其中循環(huán)控制表達(dá)式與’0’等價 C:其中循環(huán)控制表達(dá)式是不合法的 D: 以上說法都不對 題目解析: 因print(“*”)函數(shù)調(diào)用的返回值是字符串中字符的個數(shù),即為1。

    2024年02月10日
    瀏覽(19)
  • Kafka核心原理第二彈——更新中

    Kafka核心原理第二彈——更新中

    1. Kafka Producer怎么把消息發(fā)送給Broker集群的? 需要指定把消息發(fā)送到哪個topic去 首先需要選擇一個topic的分區(qū),默認(rèn)是輪詢來負(fù)載均衡,但是如果指定了一個分區(qū)key,那么根據(jù)這個key的hash值來分發(fā)到指定的分區(qū),這樣可以讓相同的key分發(fā)到同一個分區(qū)里去,還可以自定義par

    2024年02月09日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)——單鏈表OJ題(第二彈)

    數(shù)據(jù)結(jié)構(gòu)——單鏈表OJ題(第二彈)

    此次練習(xí)題有兩道! 有點小難度,但相信難不住大家的! 我也會給出兩道OJ題的鏈接,大家也趕快去試一試吧 題目鏈接: OJ鏈接 提示: 鏈表中節(jié)點的數(shù)目范圍在范圍 [0, 104] 內(nèi) -105 = Node.val = 105 pos 的值為 -1 或者鏈表中的一個有效索引 本題有兩個解析思路~ 代碼演示: 提示:

    2024年02月14日
    瀏覽(25)
  • 藍(lán)橋杯必備動態(tài)規(guī)劃第二彈-路徑問題進(jìn)階

    藍(lán)橋杯必備動態(tài)規(guī)劃第二彈-路徑問題進(jìn)階

    最小路徑和 先看一眼題干什么意思-我們可以知道,左上角到右下角的最小路徑和 1.狀態(tài)表示(第一步其實是最重要,因為他可以確定狀態(tài)轉(zhuǎn)移方程) dp[i][j]:到ij位置,路徑之和是最小 2.狀態(tài)轉(zhuǎn)移方程(為什么這么寫,首先你要能到ij位置,其次你需要+ij位置的數(shù)字) dp[i][j

    2024年02月08日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包