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(控制流平坦化,虚假控制流程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUU——WMCTF2020 - eas
- 下一篇: --杂记--