首页
社区
课程
招聘
[分享][原创]Radare2+Frida实现破解
发表于: 2020-12-26 23:37 6936

[分享][原创]Radare2+Frida实现破解

2020-12-26 23:37
6936

黑客攻击-软件破解(2) 中通过Radare2的静态分析实现了破解。本文使用frida和radare2进行动态分析来对crackerMe系列中后面的例子进行破解。

首先通过agf查看流程图。

sscanf() 函数的声明。

作用是从字符串读取格式化输入。

cmp指令: 该指令与SUB指令一样执行减法的操作,但它并不保存运算结果,只是根据结果设置相关的条件标志位(SF、ZF、CF、OF)。CMP指令后往往跟着条件转移指令,实现根据比较的结果产生不同的程序分支的功能。 inc是增量指令。 inc指令: 该指令对操作数oprd加1(增量),它是一个单操作数指令。操作数可以是寄存器或存储器。由于增量指令主要用于对计数器和地址指针的调整,所以它不影响进位标志CF,对其他状态标志位的影响与add指令一样。

通过pdg查看以下decompiler的代码

通过流程图可知核心算法在中间部分,并且可以看出存在循环。在这里插入图片描述第一次循环:

1.把var_ch内存中的值赋值给eax mov eax, dword [var_ch]2.把arg_8h(check函数参数,也就是输入的字符串)中的值和eax相加 add eax, dword [arg_8h]3.将eax取byte扩充(相当于取低8位) movzx eax, byte [eax] mov byte [var_dh], al4.将var_4h赋值给eax,注意这里是lea指令lea eax, [var_4h]5.将eax的值赋给var_sp_8h指向的内存(为sscanf传递参数,从右向左入栈) mov dword [var_sp_8h], eax6.将0x8048638("%d")赋给var_sp_4h指向的内存 mov dword [var_sp_4h], 0x80486387.eax入栈(eax和var_dh的值是一样的) lea eax, [var_dh] mov dword [esp], eax8.调用用sscanf函数 call sym.imp.sscanf9.将var_4h指向的值赋给edx mov edx, dword [var_4h]10.将var_8h的值赋给eax lea eax, [var_8h]11.edx和eax指向的值相加 add dword [eax], edx12.比较var_8h内存中的值和0xf cmp dword [var_8h], 0xf13.如果相等,则出现成功的提示,如果不相等,则跳转到0x80484f4 cmp dword [var_8h], 0xf jne 0x80484f4 假设不相等,开始第二轮的循环。

通过上面的分析,可知check函数的功能:对字符串中的每个字符取整(类似atoi),然后对每个字符相加,和0xf进行比较,只有相等的情况,才能Pass.

下面通过多种方式来破解这个程序。

知道逻辑,很容易破解这个程序。输入12345(和是0xf),Pass.在这里插入图片描述

修改参数为96(和是0xf),则无论输入什么都可以使程序Pass. 32位的函数参数传递方式在strcpy为何不安全 中有所介绍。

通过r2来获取96对应的asci码是0x39 0x36在这里插入图片描述运行frida脚本,这样无论输入什么的都可以Pass.在这里插入图片描述Thread.sleep(delay): suspend execution of the current thread for delay seconds specified as a number. 由于Ansi相关的函数只能用在Windows平台中,所以这里才使用byte数组。

Note that writeAnsiString() is only available (and relevant) on Windows.

修改跳转指令。使得程序无论如何都可以成功运行。

1.如果相等,则出现成功的提示,如果不相等,则跳转到0x80484f4 cmp dword [var_8h], 0xf jne 0x80484f4


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//