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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

angr学习笔记(4) (寄存器符号化)

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 angr学习笔记(4) (寄存器符号化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

angr系列

00_angr_find

01_angr_avoid

02_angr_find_condition

03_angr_symbolic_registers

04_angr_symbolic_stack

05_angr_symbolic_memory

06_angr_symbolic_dynamic_memory

07_angr_symbolic_file

08_angr_constraints

09_angr_hooks

10_angr_simprocedures

13_angr_static_binary

文章目錄

    • angr系列
      • 00_angr_find
      • 01_angr_avoid
      • 02_angr_find_condition
      • 03_angr_symbolic_registers
      • 04_angr_symbolic_stack
      • 05_angr_symbolic_memory
      • 06_angr_symbolic_dynamic_memory
      • 07_angr_symbolic_file
      • 08_angr_constraints
      • 09_angr_hooks
      • 10_angr_simprocedures
      • 13_angr_static_binary
    • 偽代碼分析
    • 過程分析
    • 腳本:
    • 驗證

偽代碼分析



匯編代碼為:

這里的話,我們需要把start_address放在0x0804898C

.text:0804890C push ebp .text:0804890D mov ebp, esp .text:0804890F sub esp, 18h .text:08048912 mov ecx, large gs:14h .text:08048919 mov [ebp+var_C], ecx .text:0804891C xor ecx, ecx .text:0804891E lea ecx, [ebp+var_10] .text:08048921 push ecx .text:08048922 lea ecx, [ebp+var_14] .text:08048925 push ecx .text:08048926 lea ecx, [ebp+var_18] .text:08048929 push ecx .text:0804892A push offset aXXX ; "%x %x %x" .text:0804892F call ___isoc99_scanf .text:08048934 add esp, 10h .text:08048937 mov ecx, [ebp+var_18] .text:0804893A mov eax, ecx .text:0804893C mov ecx, [ebp+var_14] .text:0804893F mov ebx, ecx .text:08048941 mov ecx, [ebp+var_10] .text:08048944 mov edx, ecx .text:08048946 nop .text:08048947 mov ecx, [ebp+var_C] .text:0804894A xor ecx, large gs:14h .text:08048951 jz short locret_804

然后從右往左填參數,ebp+var_10為第三個輸入參數,ebp+var_14為第二個輸入參數,ebp+var_18為第一個輸入參數,也就是說,寄存器返回值中,eax是第一個輸入參數,ebx是第二個輸入參數,edx是第三個輸入參數,緊接著往下:

.text:0804896E push offset aEnterThePasswo ; "Enter the password: " .text:08048973 call _printf .text:08048978 add esp, 10h .text:0804897B call get_user_input .text:08048980 mov [ebp+var_14], eax .text:08048983 mov [ebp+var_10], ebx .text:08048986 mov [ebp+var_C], edx .text:08048989 sub esp, 0Ch .text:0804898C push [ebp+var_14] .text:0804898F call complex_function_1 .text:08048994 add esp, 10h .text:08048997 mov ecx, eax .text:08048999 mov [ebp+var_14], ecx .text:0804899C sub esp, 0Ch .text:0804899F push [ebp+var_10] .text:080489A2 call complex_function_2 .text:080489A7 add esp, 10h .text:080489AA mov ecx, eax .text:080489AC mov [ebp+var_10], ecx .text:080489AF sub esp, 0Ch .text:080489B2 push [ebp+var_C] .text:080489B5 call complex_function_3 .text:080489BA add esp, 10h .text:080489BD mov ecx, eax .text:080489BF mov [ebp+var_C], ecx .text:080489C2 cmp [ebp+var_14], 0 .text:080489C6 jnz short loc_8048

過程分析

  • 改變start_address:
  • p=angr.Project(bin_path)start_addr=0x08048980init_state=p.factory.blank_state(addr=start_addr)
  • pass1=claripy.BVS('pass1',32)pass2=claripy.BVS('pass2',32)pass3=claripy.BVS('pass3',32)init_state.regs.eax=pass1init_state.regs.ebx=pass2init_state.regs.edx=pass3

    調用的函數為claripy.BVS(),該函數實際存在于claripy.ast.bv.py文件中。它的作用就是創建一個為符號向量(即,一個變量)。
    函數參數:

    claripy.ast.bv.BVS(name, size, min=None, max=None, stride=None, uninitialized=False, explicit_name=None, discrete_set=False, discrete_set_max_card=None, **kwargs)
  • :param name: 符號的名字.
  • :param size: 位向量的大小(以位為單位)
  • :param min: 符號的最小值,僅用于值集分析
  • :param max: 符號的最大值,僅用于值集分析
  • :param stride: 符號的stride(步幅),僅用于值集分析
  • :param uninitialized: 在分析過程中,這個值是否應該被視為一個未初始化的值.
  • :param bool explicit_name: 如果為False, 則將名稱附加標識符以確保唯一性.
  • :param bool discrete_set: 如果為True, 則將使用DiscreteStridedIntervalSet而不是普通的StridedInterval.
  • :param int discrete_set_max_card: 離散集合的最大基數。如果discrete_set設置為False或None,則忽略它.
  • :returns: 代表該符號的BV對象.
  • 另一個創建符號變量的函數為claripy.BVV(),用于創建一個位向量 (即,一個具體值)(后面會說)。

    函數參數:

    def BVV(value, size=None, **kwargs):
  • :param value: 值, 整數或字符串。如果是字符串, 它將被解釋為一個大端常量的字節。
  • :param size: 位向量的大小(以位為單位)。 如果值是字符串則可選,如果值是整數,則必須指定。
  • :returns: 代表該值的BV對象。
  • 創建符號變量后,需要指定符號執行的起始狀態,也就是從程序的哪個部分開始執行符號執行

    最后再來對變量進行求解

    password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)

    腳本:

    import angr import sys import claripydef main(argv):bin_path=argv[1]p=angr.Project(bin_path)start_addr=0x08048980init_state=p.factory.blank_state(addr=start_addr)pass1=claripy.BVS('pass1',32)pass2=claripy.BVS('pass2',32)pass3=claripy.BVS('pass3',32)init_state.regs.eax=pass1init_state.regs.ebx=pass2init_state.regs.edx=pass3sm=p.factory.simulation_manager(init_state)def is_good(state):return b'Good Job.' in state.posix.dumps(1)def is_bad(state):return b'Try again.' in state.posix.dumps(1)sm.explore(find=is_good,avoid=is_bad)if sm.found:found_state=sm.found[0]password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)print("Solution:{} {} {}".format(password1,password2,password3))else:raise Exception("No solution found")if __name__=='__main__':main(sys.argv)

    3120549966 3438690280 2413091161

    十六進制顯示:

    print("Solution:{:x} {:x} {:x}".format(password1,password2,password3))

    b9ffd04e ccf63fe8 8fd4d959

    驗證

    password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)

    這里通過求解的方式,而不是通過下方這種打印出 標準輸入值

    print("stdin:",found_state.posix.dumps(0));

    這種方式打印出來是空,因為我們沒有執行scanf那一個函數,而是直接跳過了。

    總結

    以上是生活随笔為你收集整理的angr学习笔记(4) (寄存器符号化)的全部內容,希望文章能夠幫你解決所遇到的問題。

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