新160个CrackMe036-Andrnalin.2、037-fireworx.2、038-Eternal Bliss.3逆向分析
036无壳暴力破解字符串查找发现不认识字符串的意思搜索可以知道RICHTIG! LEIDER FALSCH! Leider Falsch! Nochmal versuchen! Wenn Du es nicht schaffen solltest, schreib mir! Andrenalingmx.net中文翻译正确可惜错了可惜错了再试一次如果你搞不定给我写信Andrenalingmx.net第一个字符串是正确语句查找到关键跳转语句将他给nop掉即可获得破解版本在这个函数开头设置断点之后重新运行分析算法算法分析先是对用户名进行一个循环操作将用户名的每一个ASCII码值累加之后将累加的值进行一个乘法前两个参数为乘数和被乘数第三个参数0x3为标志结果为整数类型0x499602D2十进制表示为1234567890这里的测试用例用户名是admin计算之后的结果是643,209,870,690下面有进行一个操作之后原来得到的结果第四个字符位置的数变成了“-”初步推测第九位数字也会被替换成“-”验证成功可以写出keygen:usernameinput(Input username:).strip() sum0 for ch in username: sumord(ch) sum*1234567890 result_strstr(sum) resultlist(result_str) result[3]- result[8]- serial.join(result) print(fserial:{serial})037无壳无neg暴力破解找到相关跳转到正确语句和错误语句将这个给nop掉即可获取破解版本算法分析显示获取用户名和序列号备用再将用户名和三个字符串“625”“g”“72”都压栈之后调用一个函数通过函数的返回结果可以初步推算出这是一个函数实现用户名和三个字符串的拼接“用户名用户名625g72”里面的函数是先计算真正的序列号长度再将字符串拼接可以生成keygen:usernameinput(Input username:).strip() ser1625 ser2g ser372 serialusernameusernameser1ser2ser3 print(fSerial{serial})038无壳无neg可以分析出输入的序列号必须大于6个字符暴力破解找到相关跳转给nop掉发现不起作用先从成功和失败语句向前找函数头进行分析发现前面还有一个是关系是否成功的跳转将这四个全给nop掉即可获取破解版本向上找发现一个字符串为Reserve尝试他是否为序列号进行验证发现成功Reserve就是序列号算法分析先是进行赋值初始化之后获取了用户输入的序列号和序列号长度fnclex 的作用是清除 FPU 中所有挂起的异常标志对输入的序列号进行逐个字符ASCII码值累加存到ecx中之后再进行了六次加法从R的ASCII码值开始最后的结果存在eax中为732刚好是“Reserve”字符串每个字符ASCII码值的累加和732之后将获得的累加和和用户输入的序列号累加和进行对比相等则继续失败则直接跳转失败语句弹窗这是暴力破解中第一个需要nop掉的跳转继续向下有两段相似代码大致推测这是在先对输入的序列号进行转存到某个位置之后再进行验证之后再取出字符串中第2、4、7个字符及其ASCII码值之后减e的ASCII码值进行运算最后判断取出的字符中与e相等的有几个没有三个就跳转失败下面先释放申请的空间接下来进行三个计算操作溢出则跳转失败最后的结果不相等也跳转失败每次计算都要先扩展前两次是对一个数求商之后再乘一个新的数第三次是只求商即result ((((A / B) * C) / D) * E) / F比较 result 期望值A B C D E F的值分别为7352726576result ((((0x7FFFFFFF / 115) * 82) / 114) * 101) / 118比较 result 11496889里面的除数和乘数刚好为Reserve的ASCII码值乱序版本这个和验证序列号是否正确无关综上所述对程序进行暴力破解只需要将判断判断用户输入序列号ASCII码值累加和与目标字符串累加和是否相等的跳转、判断用户输入的第2、4、7位置是否是e的跳转402DD2、403115这两处的跳转给nop掉即可