abex’crackme #1
先运行abex’crackme #1这个程序
意思是:“让我认为你的硬盘是个光驱。”
按"确定",显示"这不是一个光驱!"
开始调试
-
一进来可以看懂mian函数的代码。说明不是用高级语言写的代码,高级语言一般会加启动函数。这我们认为用汇编语言写的
-
按F8逐步执行,运行到40100E的时候点一下消息框 “确定”,之后继续F8执行
-
执行到0040101D时,我们可观察到:EAX=00000003,ESI=00401000
-
INC INCREASE 自增1,ESI=00401001
-
DEC DECREASE 自减1,EAX=00000002
-
在401024处,EAX=00000001,ESI=00401003
-
CMP EAX,ESI,COMPARE 将EAX和ESI做对比,内部通过EAX-ESI完成,若两操作数相等,CMP=0,ZF=1.如果不等,ZF=0
-
JE 40103D 有条件跳转。如果ZF=1.就跳转40103D,否则不跳转
分析及操作
我们希望是显示00401044这一地址的内容,也就希望跳转到40103D。有以下方法:
1.构造完全相等的寄存器
1>让EAX=ESI。更改前面的INC或DEC,使得EAX=ESI
2>在00401024处修改 Disassembly
如:CMP EAX,ESI改为CMP EAX,EAX
2.进行无条件跳转
按空格键修改指令,将JE替换成JMP
进行无条件跳转,跳转到第3个对话框:
按F9运行,成功弹出消息框:
将参数压入栈
C语言:
函数名(参数1,参数2 ,参数3,参数4)
汇编语言:
Push 参数4
Push 参数3
Push 参数2
Push 参数1
CALL 函数入口地址
比较C语言代码与汇编代码可以看到,函数调用时的参数顺序(正序)与参数入栈时的顺序(逆序)相反。