标签:
Date-2015/11/15 Sunday
YPP
初学破解,往往都是从“爆破”开始。
本文没有多少技术含量,仅仅对以前的学习做一个简单的回顾;
文中尚有不妥之处,恳请各位同行不吝赐教!谢谢。
C实现的简单密码验证,图1:
//Crack_1.cpp
#include <stdio.h>
#include <string.h>
#define PASSWORD "1234567"
int ypp(char *);
int main()
{
char password[1024];
int n=0;
while(1)
{
printf("Please input PASSWORD:\t");
scanf("%s",password);
n=ypp(password);
if(n)
printf("Error!\n\n");
else
{
printf("Congratulation!\n\n");
break;
}
}
return 0;
}
int ypp(char *password)
{
int num;
num=strcmp(password,PASSWORD);
return num;
}
在VC6.0下编译运行,再用IDA对其反汇编,如图2:
从反汇编信息中很容易识别出main的地址0x00401020
下一步Ollydbg载入, 暂且在这个地方下断点:
图3:
图4
F9让程序“跑”起来!中断在此处。
F8单步至0040106A.scanf 此时程序正在等待我们输入“密码”
输入假密码(20151115),回车:
图5
继续单步……至00401079 CALL crack_1.00401005
图6
F7单步步入,就会来到ypp()的领空:
图7
图8
想知道密码的具体验证过程,就要仔细观察上面这段反汇编;
当单步到00401111 时,OD已识别出该C库函数strcmp()
存有真密码的参数值也被暴露出来!
图9
图10 (EAX的值为1,即局部变量num值为真,密码判定失败!)
莫急,关键在后面。
当步过RETN时,走出ypp()又回到了0040107E
图11
“Jump is NOT taken”意为“不执行跳转!” 那么就继续往下执行(输出error!)
<爆破的关键就在于此>
<JE SHORT Crack_1.0040109F ;将“JE”改为“JNE”即完成爆破!>
汇编指令JE和JNE作用是相反的
JE: 相等转移
JNE:不相等转移
双击“Disassembly”栏中的JE指令,修改后单击“Assemble”
图12
图13
图14
图15
需要注意的是,这种修改是“临时”的。
若想永久保留,请继续往下看:
1.鼠标右键选中“JNZ SHORT……”这一行:Follow in Dump——Selection
图16
2.同样的方法,选中数据面板……Copy to executable file
图17
3.Save File……
图18
图19
验证
END.
(YPP)2015/11/15.
标签:
原文地址:http://www.cnblogs.com/yppsniper/p/4967761.html