前言
c语言32windows程序逆向
提示:以下是本篇文章正文内容,下面案例可供参考
一、对exe文件进行查壳
发现是32为的exe无壳程序,使用IDA对程序进行打开反编译。
二、反编译分析
1.整体逻辑分析
主函数有两个可执行函数,首先进入第一个_main函数,init是c语言程序进行初始化的程序,对我们分析主要函数没有什么影响。
进入func()可执行函数,显而易见的发现这个函数就是我们的主要加密函数。
首先执行对v12数组进行赋值,将’Qsw3sj_lz4_Ujw@l‘字符串copy到数组v12之中,然后执行scanf函数。这段是我们的输入的部分(动态调试会出现的)。
这个判断实际上是 ACTF{}这个flag的包裹 (ida中使用r快捷键可以将ascii转化为对应的字符串)
这一段代码是一大段的对变量的判断,再判断之后对v1数组进行赋值。将v12[17]的数据赋值为0。
第一个while循环,有两个判断,执行判断后将会使v12[17]的值+1,第一个是对大写字母的加密算法第二个是对小写字字母的加密算法。 执行加密后对加密后的输入进行于原本程序设定的字符串进行比较。
2部分分析
*((_BYTE *)v1 + i) = (*((char *)v1 + i) - 51) % 26 + 65 这段代码的逆运算是
*((_BYTE *)v1 + i) -65+n(这里的n指的是一个未知数)*26+51= *((char *)v1 + i) 但是我们不知道n这里具体的值 如果进行例举的话很麻烦 所以这里对脚本的构造使用爆破 对密码进行破解
为什么使用v12的字符串作为加密后的正确密文,这里我是猜测的,不会平白无故给一个字符串的。
在脚本构建时,我最开始时使用的ascii范围是(65,127),但是后来去看了别人的blog发现flag中是含有数字的所以将爆破的范围改为了(0,127)。
flag{Cae3ar_th4_Gre@t}