buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)
這題一開始拿到人看麻了(不會),寫篇wp記錄新題型
這么一大大大串的函數(shù)圖,是經(jīng)過OLLVM 的控制流平坦化混肴.
控制流平坦化(Control Flow Flattening)的基本思想主要是通過一個主分發(fā)器來控制程序基本塊的執(zhí)行流程,例如下圖是正常的執(zhí)行流程:
經(jīng)過控制流平坦化后的執(zhí)行流程就如下圖:
混淆代碼塊之間的邏輯,將其之前的邏輯混肴成switch嵌套循環(huán),增加分析難度。
下面我們需要使用 angr符號執(zhí)行去除控制流平坦化
環(huán)境ubuntu20.4?defalt.py腳本?(之前配好過angr環(huán)境)
在defalt.py上加上第12行
?查看main函數(shù)地址
python deflat.py -f attachment --addr 0x400620
如此便為成功。
ida打開生成文件
邏輯清楚很多 ,分析代碼。
?這里的條件橫為0,不執(zhí)行
mian結(jié)束的地方
idapython腳本刪除這些代碼
st = 0x0000000000400620 #main開始 end = 0x0000000000402144 #main結(jié)束def patch_nop(start,end):for i in range(start,end):ida_bytes.patch_byte(i, 0x90) #修改指定地址處的指令 0x90是最簡單的1字節(jié)nopdef next_instr(addr):return addr+idc.get_item_size(addr) #獲取指令或數(shù)據(jù)長度,這個函數(shù)的作用就是去往下一條指令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) #得到操作數(shù),就是指令后的數(shù)ida_bytes.patch_byte(addr, 0xe9) #0xe9 jmp后面的四個字節(jié)是偏移ida_bytes.patch_byte(addr+5, 0x90) #nop第五個字節(jié)offset = dest - (addr + 5) #調(diào)整為正確的偏移地址 也就是相對偏移地址 - 當(dāng)前指令后的地址ida_bytes.patch_dword(addr + 1, offset) #把地址賦值給jmp后print("patch bcf: 0x%x"%addr)addr = nextbreakelse:addr = next?算法分析:
輸入一個48字節(jié)的數(shù)據(jù)。
第一部分:將空格換成0
第二部分:每次讀取八個字節(jié),如果大于0,則乘以2。如果小于0就乘以2再異或一個數(shù)。
CRC算法。
secret = [0xBC8FF26D43536296, 0x520100780530EE16, 0x4DC0B5EA935F08EC,0x342B90AFD853F450, 0x8B250EBCAA2C3681, 0x55759F81A2C68AE4] key = 0xB0004B7679FA26B3flag = ""# 產(chǎn)生CRC32查表法所用的表 for s in secret:for i in range(64):sign = s & 1 #數(shù)乘以二,必為偶數(shù),再異或上奇數(shù),得奇數(shù) 所以最后一位為1的數(shù)還原前為負(fù)。if sign == 1:s ^= keys //= 2# 防止負(fù)值除2,溢出為正值if sign == 1:s |= 0x8000000000000000 #讓數(shù)回到負(fù)數(shù)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
總結(jié)
以上是生活随笔為你收集整理的buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUU——WMCTF2020 - eas
- 下一篇: --杂记--