日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這題一開始拿到人看麻了(不會),寫篇wp記錄新題型

這么一大大大串的函數圖,是經過OLLVM 的控制流平坦化混肴.

控制流平坦化(Control Flow Flattening)的基本思想主要是通過一個主分發器來控制程序基本塊的執行流程,例如下圖是正常的執行流程:

經過控制流平坦化后的執行流程就如下圖:

混淆代碼塊之間的邏輯,將其之前的邏輯混肴成switch嵌套循環,增加分析難度。

下面我們需要使用 angr符號執行去除控制流平坦化

環境ubuntu20.4?defalt.py腳本?(之前配好過angr環境)

在defalt.py上加上第12行

?查看main函數地址

python deflat.py -f attachment --addr 0x400620

如此便為成功。

ida打開生成文件

邏輯清楚很多 ,分析代碼。

?這里的條件橫為0,不執行

mian結束的地方

idapython腳本刪除這些代碼

st = 0x0000000000400620 #main開始 end = 0x0000000000402144 #main結束def patch_nop(start,end):for i in range(start,end):ida_bytes.patch_byte(i, 0x90) #修改指定地址處的指令 0x90是最簡單的1字節nopdef next_instr(addr):return addr+idc.get_item_size(addr) #獲取指令或數據長度,這個函數的作用就是去往下一條指令addr = st while(addr<end):next = next_instr(addr)if "ds:dword_603054" in GetDisasm(addr): #GetDisasm(addr)得到addr的反匯編語句while(True):addr = nextnext = next_instr(addr)if "jnz" in GetDisasm(addr):dest = idc.get_operand_value(addr, 0) #得到操作數,就是指令后的數ida_bytes.patch_byte(addr, 0xe9) #0xe9 jmp后面的四個字節是偏移ida_bytes.patch_byte(addr+5, 0x90) #nop第五個字節offset = dest - (addr + 5) #調整為正確的偏移地址 也就是相對偏移地址 - 當前指令后的地址ida_bytes.patch_dword(addr + 1, offset) #把地址賦值給jmp后print("patch bcf: 0x%x"%addr)addr = nextbreakelse:addr = next

?算法分析:

輸入一個48字節的數據。

第一部分:將空格換成0

第二部分:每次讀取八個字節,如果大于0,則乘以2。如果小于0就乘以2再異或一個數。

CRC算法。

secret = [0xBC8FF26D43536296, 0x520100780530EE16, 0x4DC0B5EA935F08EC,0x342B90AFD853F450, 0x8B250EBCAA2C3681, 0x55759F81A2C68AE4] key = 0xB0004B7679FA26B3flag = ""# 產生CRC32查表法所用的表 for s in secret:for i in range(64):sign = s & 1 #數乘以二,必為偶數,再異或上奇數,得奇數 所以最后一位為1的數還原前為負。if sign == 1:s ^= keys //= 2# 防止負值除2,溢出為正值if sign == 1:s |= 0x8000000000000000 #讓數回到負數j = 0while j < 8:flag += chr(s&0xFF) #&0xff可以將高的24位置為0,低8位保持原樣。s >>= 8j += 1 print(flag)

flag{6ff29390-6c20-4c56-ba70-a95758e3d1f8}

參考

https://blog.csdn.net/liuxiaohuai_/article/details/114369681

https://blog.csdn.net/weixin_50166464/article/details/121635877?spm=1001.2014.3001.5501

總結

以上是生活随笔為你收集整理的buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。