黑客大神告诉你:Angr_CTF从精通到弃坑( 二 )
运行一下测试:
文章插图
.text:080485C4movds:password, 'DPUA'.text:080485CEmovds:dword_804A044, 'RPNN'.text:080485D8movds:dword_804A048, 'RZEO'.text:080485E2movds:dword_804A04C, 'BKWJ'
通过这里不难的得出需要比较的字符串是AUPDNNPROEZRJWKB(虽然从函数名也能看出来 , 但是还是从汇编解释一下为好)
首先总结一下我们的思路:
- 用户输入的字符串存储在buffer , buffer的地址为:0x804A050
- 比较函数check_equals_AUPDNNPROEZRJWKB的地址为:0x08048565
- 其实只要当程序运行到地址0x08048565时 , 处于buffer地址内的字符串等于AUPDNNPROEZRJWKB即可
- 添加上述约束条件即可一步得出结果 , 而不用进入比较函数逐一字符比较而产生路径爆炸问题
path_to_binary = "./08_angr_constraints" project = angr.Project(path_to_binary, auto_load_libs=False)start_address = 0x8048625buff_addr = 0x0804A050address_to_check_constraint = 0x08048565initial_state = project.factory.blank_state(addr=start_address)
因为输入是scanf("%16s",, 如之前一样 , 不难得出我们需要构建的符号位向量的参数char_size_in_bits = 8passwd_len = 16passwd0 = claripy.BVS('passwd0', char_size_in_bits*passwd_len)initial_state.memory.store(buff_addr, passwd0)
然后初始化并执行模拟管理器 , 运行到调用check函数的状态simulation = project.factory.simgr(initial_state)simulation.explore(find=address_to_check_constraint)
然后利用使用 state.memory 的 .load(addr, size)接口读出buffer处的内存数据if simulation.found:solution_state = simulation.found[0]constrained_parameter_address = buff_addrconstrained_parameter_size_bytes = 16constrained_parameter_bitvector = solution_state.memory.load(constrained_parameter_address,constrained_parameter_size_bytes)
利用slover求解引擎提供的add方法加入约束条件constrained_parameter_desired_value = 'http://kandian.youth.cn/index/AUPDNNPROEZRJWKB'solution_state.solver.add(constrained_parameter_bitvector == constrained_parameter_desired_value)
接下来和之前的题目类似 , 不再赘述09_angr_hooks这题如题目所言 , 主要就是学习使用angr的hook技术解决路径爆炸问题 , 与我们之前利用的约束条件不同 , hook技术则更为强大
以下内容来自维基百科:
钩子编程(hooking) , 也称作“挂钩” , 是计算机程序设计术语 , 指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术 。 处理被拦截的函数调用、事件、消息的代码 , 被称为钩子(hook) 。
简单来说就是用我们自己设计的函数去取代被hook的函数
首先检查一下该程序:
syc@ubuntu:~/Desktop/TEMP$ checksec 09_angr_hooks[*] '/home/syc/Desktop/TEMP/09_angr_hooks'Arch:i386-32-littleRELRO:Partial RELROStack:No canary foundNX:NX enabledPIE:No PIE (0x8048000)
用IDA查看一下:int __cdecl main(int argc, const char **argv, const char **envp){_BOOL4 v3; // eaxsigned int i; // [esp+8h] [ebp-10h]signed int j; // [esp+Ch] [ebp-Ch]qmemcpy(password, "XYMKBKUHNIQYNQXE", 16);memset(buffer, 0, 0x11u);printf("Enter the password: ");__isoc99_scanf("%16s", buffer);for ( i = 0; i <= 15; ++i )*(_BYTE *)(i + 0x804A054) = complex_function(*(char *)(i + 0x804A054), 18 - i);equals = check_equals_XYMKBKUHNIQYNQXE(buffer, 16);for ( j = 0; j <= 15; ++j )*(_BYTE *)(j + 0x804A044) = complex_function(*(char *)(j + 0x804A044), j + 9);__isoc99_scanf("%16s", buffer);v3 = equalsequals = v3;if ( v3 )puts("Good Job.");elseputs("Try again.");return 0;}
_BOOL4 __cdecl check_equals_XYMKBKUHNIQYNQXE(int a1, unsigned int a2){int v3; // [esp+8h] [ebp-8h]unsigned int i; // [esp+Ch] [ebp-4h]v3 = 0;for ( i = 0; i < a2; ++i ){if ( *(_BYTE *)(i + a1) == *(_BYTE *)(i + 0x804A044) )++v3;}return v3 == a2;}
int __cdecl complex_function(signed int a1, int a2){if ( a1 <= 64 || a1 > 90 ){puts("Try again.");exit(1);}return (a1 - 65 + 23 * a2) % 26 + 65;}
其实和上一题并没有什么太大的变化 , 主要是我们上一题是使用增加条件约束的方法减少路径分支 , 而这一题我们直接利用hook改写complex_function函数为我们自己的函数Hookangr使用一系列引擎(SimEngine的子类)来模拟被执行代码对输入状态产生的影响 。 其中就有hook engine来处理hook的情况 。 默认情况下 , angr 会使用 SimProcedures 中的符号摘要替换库函数 , 即设置 Hooking , 这些 python 函数摘要高效地模拟库函数对状态的影响 。 可以通过 angr.procedures或 angr.SimProcedures 查看列表
- 化妆产品|直播带货年入百万,这8个行业告诉你:是真的
- 大神|研究完各路大神,终于知道互联网创业的你为何不赚钱
- 欺诈和滥用|美国最高法院审理黑客法及其限制的案件
- 美国|美国新“电影”,“谍战大片”打脸黑客帝国
- iQO|还不知道选?偷偷告诉你这些iQOO型号手机最值得买
- 告诉|阿里大佬告诉你如何一分钟利用Python在家告别会员看电影
- 捐赠|出乎意料——黑客勒索集团向慈善机构捐赠20000美金
- RTX 3090没啥性价比,破解密码倒挺厉害,黑客要大出血?
- 爆笑!Mate40只是曝光了一个侧脸,各路大神就玩起了骚操作
- Python大神用的贼溜,9个实用技巧分享给你