Crackme3笔记

**链接:https://www.52pojie.cn/thread-264605-1-1.html
http://www.52pojie.cn/thread-612982-1-1.html
http://www.cnblogs.com/bbdxf/p/3780187.html**

1、去除neg窗口后,用堆栈平衡法,到达程序的关键跳转处,直接nop即可爆破。然后找出算法,在该段程序的开始处下断,F8单步跟
这里写图片描述
2、首先找到出现name的位置
这里写图片描述
3、继续F8跟,发现第一次用浮点运算的位置
这里写图片描述
4、继续F8跟,发现第二次用浮点运算的位置
这里写图片描述
5、继续F8跟,发现第三次用浮点运算的位置
这里写图片描述
6、继续F8跟,发现出现序列号的位置,但是我没法分析
这里写图片描述
7、试试序列号“1333486”吧!
这里写图片描述
所以算法是,首先计算name的长度*0x15b38+首字母的ascii,并将其转为10进制;其次将其转为浮点数并+2.0;再次,将结果*3.0 - 2.0;最后-(-15.0)即得到结果。

备注:有关浮点数的命令
https://blog.csdn.net/qq_22642239/article/details/51097733
https://bbs.csdn.net/topics/10037155
这些指令都是80387的浮点指令
80387指令都是用栈顶作为操作数,ST即栈顶,ST(i)表示距栈顶的第i个元素,ST=ST(0)

  • fld 将浮点数据压入协处理器的堆栈中
  • fdiv 浮点数除
  • fadd 浮点数加
  • fmul 浮点数乘
  • fsub 浮点数减
  • fstp 将栈顶数据送入到目标操作数中
  • fstsw 将状态寄存器送入到内存变量中

如果后面加了p,如faddp表示执行完操作后,还要进行一次堆栈弹出工作

猜你喜欢

转载自blog.csdn.net/qq_15727809/article/details/79800108