BUUCTF-[网鼎杯 2020 青龙组]singal——angr学习记录
??????學(xué)習(xí)結(jié)合b站的視頻
環(huán)境配置:Ubuntu20.04+python3?
??????angr安裝教程
切換到angr環(huán)境:workon angr
退出angr環(huán)境:deactivate
什么是符號(hào)執(zhí)行:
符號(hào)執(zhí)行 (Symbolic Execution)是一種程序分析技術(shù)。其可以通過(guò)分析程序來(lái)得到讓特定代碼區(qū)域執(zhí)行的輸入。使用符號(hào)執(zhí)行分析一個(gè)程序時(shí),該程序會(huì)使用符號(hào)值作為輸入,而非一般執(zhí)行程序時(shí)使用的具體值。在達(dá)到目標(biāo)代碼時(shí),分析器可以得到相應(yīng)的路徑約束,然后通過(guò)約束求解器來(lái)得到可以觸發(fā)目標(biāo)代碼的具體值。[1] 符號(hào)模擬技術(shù)(symbolic simulation)則把類(lèi)似的思想用于硬件分析。符號(hào)計(jì)算(Symbolic computation)則用于數(shù)學(xué)表達(dá)式分析。我理解為更厲害的爆破。
基礎(chǔ)語(yǔ)句:
import angrproj = angr.Project('文件名') #新建一個(gè)工程 init_state=proj.factory.entry_sate() #設(shè)置程序的入口 sm=proj.factory.simulation_manager(init_state) #執(zhí)行程序 sm.explore(find=0x.....,avoid=0x.....) #執(zhí)行到某個(gè)條件,避免某個(gè)條件sm.found[0] #找到符合條件的值 found_state=sm.found[0] found_state.posix.doumps(0) #獲得我們最開(kāi)始的輸入 found_state.posix.doumps(1) #獲得我們最后的輸出?腳本例子:
import angr import sysdef main(argv):p = angr.Project('')initial_state = p.factory.entry_state()sm = p.factory.simgr(initial_state)sm.explore(find=good_addr, avoid=bad_addr) if sm.found:flag = sm.found[0]print(flag.posix.dumps(sys.stdin.fileno()))else:raise Exception('Cannot find') if __name__ == '__main__':main(sys.argv) python 02.py 02.exe?來(lái)看題目:
32位無(wú)殼,IDApro打開(kāi)
主函數(shù)很簡(jiǎn)單,我們主要分析?vm_operad(v4, 114)函數(shù)
?
find地址:
void地址:?
?
腳本解密·
import angr p = angr.Project('signal.exe') st = p.factory.entry_state() sm = p.factory.simulation_manager(st) sm.explore(find=0x40175E, avoid=0x4016E6) print(sm.found[0].posix.dumps(0))最后的flag{757515121f3d478}
我對(duì)angr第一概念就是,更厲害的爆破!!太厲害了!!
angr使用補(bǔ)充:
輸入多個(gè)參數(shù):
import angr import claripy p = angr.Project('')init_addr = 0x08048980 #scanf的下一條指令地址 state = p.factory.blank_state(addr=init_addr) #創(chuàng)建一個(gè)狀態(tài),并將該地址賦給它,也就是跳過(guò)輸入,直接執(zhí)行下一條指令,此處使用.blank_state()而不再是.entry_state()#定義三個(gè)位向量,即三個(gè)輸入 p1 = claripy.BVS('p1',32) #32位寄存器(符號(hào)向量) p2 = claripy.BVS('p2',32) p3 = claripy.BVS('p3',32)state.regs.eax = p1 #.regs.eax 訪問(wèn)eax這個(gè)寄存器 state.regs.ebx = p2 state.regs.edx = p3 sm = p.factory.simulation_manager(state) def good(state):return b'Good Job.' in state.posix.dumps(1) def bad(state):return b'Try again.' in state.posix.dumps(1) sm.explore(find = good, avoid = bad) if sm.found:find_state = sm.found[0]flag1 = find_state.solver.eval(p1)#將探索成功時(shí)的第一個(gè)輸入賦給flag1,下面兩個(gè)類(lèi)似flag2 = find_state.solver.eval(p2)flag3 = find_state.solver.eval(p3)print('{:x} {:x} {:x}'.format(flag1,flag2,flag3))引用了大佬的博客?代碼
總結(jié)
以上是生活随笔為你收集整理的BUUCTF-[网鼎杯 2020 青龙组]singal——angr学习记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [BUUCTF]Reverse——[网鼎
- 下一篇: CTF——angr使用学习记录