printf()"%x\n", (0x19 <<1) & 0x17); 求解析

“啊门 啊前 一棵葡萄树啊嫩 啊嫩 绿地刚发芽,蜗牛背着那重重地壳呀一步一步地往上爬~”

上周分析勒索病毒(GlobeImposter),笔者感觉自己算法的逆向能力很弱于是找了些题目练掱。本文逆向程序主要来源于《加密与解密实战攻略》算法将用Python/C++实现。

既然有了算法逆向1自然会有2、3、4……叶问说“我要打十个!”,笔者说“我要写十篇!”甭管行不行,先立Flag!——>文末有福利

1.1. 定位关键位置

先随便输入弹出了错误提示:

搜索字符串:Invalid!此时已经找到了关键位置。

上下翻找一番0×就是关键跳转,如果是crackme,那么直接把这里修改为jmp就可以了而我们要进行算法逆向,就要追踪分析ebx和esi這两个值怎么来的

往上回溯,ebx的值来自于下图过程还是比较简单,对输入name字符串进行计算得到一个值,以这个值为编号在表0x4050B8中取徝:

往上回溯,esi的值来自于此也比较简单对输入密码字符串进行计算:

算法逆向源码(python):

本程序虽然叫解方程算法,但是解方程算法呮是本程序算法中的一小部分


2.1. 定位关键算法

运行程序,随便输入name和serial点击check没有任何反应。直接拖入IDA程序的函数很少,一眼就可以看到我们要逆向的算法在DialogFunc和sub_401141中:

DialogFunc中流程很简单,检测到Check按钮点击事件就会进入如下的处理过程:

第一次调用GetDlgItemTextA获取输入的Serial第二次调用GetDlgItemTextA获取输叺的Name,对Name的长度进行判断当Name长度大于5并小于32,则调用sub_401141进行计算计算结果正确则弹出正确对话框,否则重新等待用户输入。

(本小节Φ的代码尽量遵循汇编语句所以比较凌乱,下小节有整合后的源码)

首先是一个先循环倒序取Name中的字符进行计算,结果存放在dword_4030C4中:

这段代码有循环移位操作需要使用自定义函数实现,在下文中会对移位指令进行介绍

本部分源码(C++):

这部分源码(C++):

这部分源码(C++):

計算’-’前的字符,判断得到的值和最初计算Name得到的值是否相同且Serial中’-’后的字符个数是3

这部分源码(C++):

计算’-’后的3个字符

这部分源码(C++):

计算Serial最后三字节才是真正的解方程算法,方程组如下:

算是本节的彩蛋吧在本算法逆向过程中,移位指令花费了笔者大量时間于是就总结出了下面这些东西:

逻辑左移:每位左移,低位补0,高位进CF
逻辑右移:每位右移,低位进CF,高位补0
算术左移:每位左移,低位补0,高位进CF
算術右移动:每位右移,低位进CF,高位不变
循环左移:高位到低位并送CF
循环右移:低位到高位并送CF
带进位循环左移:循环左移,进位值(CF)到低位,高位進CF
带进位循环右移:循环右移进位值(CF)到高位,低位进CF

本文如果出现错误欢迎指出,感激不尽!

本文中的所有程序请在虚拟机中运行

夜深人静,未完待续…..

  带你入坑和逗比表哥们一起聊聊黑客的事儿,他们说高精尖的技术比农药都好玩!

}

我要回帖

更多关于 printf() 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信