逆向入门--简单win32CK逆向手记

最近入坑逆向不就,这个算是真正意义上的第一个CrackMe遂记录逆向过程

初观界面

逆向入门--简单win32CK逆向手记_第1张图片
一个经典的输入密码并验证的小程序,先直接运行!
随便的输入密码,显然不对,弹框 incurrent 的提示框


开始分析

直接拖入OD,搜索工具搜索 Incurrent 这个字符串
逆向入门--简单win32CK逆向手记_第2张图片
跟着搜索结果,找到Ctrl+G 找到内存位置
在这里我们找到了真相,可以通过反汇编窗口很简单的看到这个。
这段看着逻辑简单清晰,通过 je 跳转到 inCurrent 的MsgBox,
爆破点Found!
那么我们通过直接修改寄存器,或者修改汇编指令成为jnz即可实现对程序的爆破,效果如下
逆向入门--简单win32CK逆向手记_第3张图片


深入分析

因为这个CrackMe是要求拿到用户名和密码的,所以爆破实现是不行的,那么继续 读代码
je的跳转是由于 FZ 这个标志位被置 1 所以发生跳转,那么我们向上找代码,看看在哪里这个寄存器位被置一

由于截图问题哈,这个关键一句没接上。。。
cmp bx,si
这一句就是比较ebx的地位,和esi寄存器的低位,从而根据结果设置了标志位

逆向入门--简单win32CK逆向手记_第4张图片

再往上,我可可以看到 OD 自动注释的关键代码,红色的_vbaVarCmpEq更是说明了一切,很显然是个字符串比较的调用

__vbastrcomp 比较两个字符串,类似于 Window’s API lstrcmp

然后查询函数的refer,得到上述的描述。
重要知识回顾 : 函数是从右往左压栈的,所以最先压入的,是最后一个参数,然后是倒数第二个。
这里,在面的寄存器信息提示窗里面,已经显示出了这个压入栈的地址对应的Unicode的字符串,正是我们输入的“密码”

这里写图片描述
然后Call 这个函数进行Cmp的比较


其实这里使用了一个投机取巧的方法,cmp 既然是比较那么 比较源,和比较目的必然是在栈中存放,那么咱们找找就好
逆向入门--简单win32CK逆向手记_第5张图片
逆向入门--简单win32CK逆向手记_第6张图片
果然不如所料,在这里就找到了咱们的用户名密码
激动的试一试

bingo!

结果如图
逆向入门--简单win32CK逆向手记_第7张图片

小结

作为自己 的第一次 的CK 虽然不是很完美,但是也算是勉强成功
特别是函数压栈这一块,也是提升了自己的认知

  • 从右向左压栈
  • 返回值永远在eax里
  • 对于win32程序有时候寄存器不够返回值存储,那么后面会压入一个returnBuffer

你可能感兴趣的:(逆向工程,来点CTF)