-
-
[分享][原创]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], al
4.将var_4h赋值给eax,注意这里是lea指令lea eax, [var_4h]
5.将eax的值赋给var_sp_8h指向的内存(为sscanf传递参数,从右向左入栈) mov dword [var_sp_8h], eax
6.将0x8048638("%d")赋给var_sp_4h指向的内存 mov dword [var_sp_4h], 0x8048638
7.eax入栈(eax和var_dh的值是一样的) lea eax, [var_dh]
mov dword [esp], eax
8.调用用sscanf函数 call sym.imp.sscanf
9.将var_4h指向的值赋给edx mov edx, dword [var_4h]
10.将var_8h的值赋给eax lea eax, [var_8h]
11.edx和eax指向的值相加 add dword [eax], edx
12.比较var_8h内存中的值和0xf cmp dword [var_8h], 0xf
13.如果相等,则出现成功的提示,如果不相等,则跳转到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期)
赞赏
- [原创]验证码和滑块破解 1321
- [分享][原创]Unidbg模拟执行so 14284
- [原创][分享]APP调试和UI定位 3445
- [分享]Frida之Stalker简介 12079
- [分享][原创]Radare2+Frida实现破解 6937