0day安全:软件漏洞技术分析-Crack小实验

打印 上一主题 下一主题

主题 568|帖子 568|积分 1706

Crack小实验
  1. #include<stdio.h>
  2. #define PASSWORD "1234567"
  3. int verify_password (char *password)
  4. {
  5.         int authenticated;
  6.         authenticated = strcmp(password,PASSWORD);        //strcmp比较两个字符,若相等返回0
  7.         return authenticated;
  8. }
  9. int main()
  10. {
  11.         int valid_flag = 0;
  12.         char password[1024];
  13.         while(1)
  14.          {
  15.                 printf("please input password:        ");
  16.                 scanf("%s",password);
  17.                 valid_flag = verify_password(password);
  18.                 if(valid_flag)
  19.                 {
  20.                         printf("incorrect password!\n\n");
  21.                 }
  22.                 else
  23.                 {
  24.                         printf("Congratulation! You have passed the verification!\n\n");
  25.                         break;
  26.                 }
  27.          }
  28.          return 0;
  29. }
复制代码

IDA静态反汇编


  • 将编译的.exe用IDA打开,IDA就会把二进制文件翻译成质量上乘的反汇编代码


  • 按下空格键会显示类似函数的流程图


  • 选中程序的分支点,也就是C代码的if语句,按空格键切换到汇编指令界面
  • VA(虚拟内存地址)=RVA(相对虚拟地址) — Image Base(映射基址)
  • 可以看到这条指令位于PE文件的.text节,VA:00401578

OllyDbg动态调式


  • 注意32位或者64位的程序,要对应版本进行调式
  • 将.exe文件用ollydbg打开,使用快捷键ctrl+g搜索由IDA分析出来的VA(虚拟内存地址)


  • 选中这条指令按F2设置断点,成功后指令会被标记成不同颜色,按下F9让程序运行。进入程序输入错误密码,回车确认后,ollydbg会重新中断程序,收回控制权

  • 密码验证函数的返回值会存在EAX寄存器中,if语句通过以下指令实现
  1. mov     [esp+41Ch], eax                                        //将eax寄存器的值放入[esp+41Ch]内存地址中,eax32位寄存器
  2. cmp     dword ptr [esp+41Ch], 0                        //将[esp+41Ch]内存地址的双字型数据和0进行比较
  3. je      short loc_401588                           //如若等于0跳转到密码确认流程,非0不跳转,执行密码重输流程
复制代码

  • 如果我们将je这条指令修改位jnz(非0则跳转),那么整个程序的逻辑就会放过来,输入错误的密码会被确认,输入正确的密码反而要求1重新输入,双击这条指令,修改成jnz,点击"Assembly",确认修改,写入内存。会发现原来的机器指令74变为75,jump is taken提示跳转将要发生。

LordPE


  • 将.exe用LordPE打开,查看PE文件的节信息,求出跳转指令在文件的偏移地址


  • 用 相对虚拟内存地址 减 文件偏移地址 得到 节偏移地址
  • 计算指令偏移地址等于之前得到相对偏移地址减去映射地址(exe的映射地址默认是0x00400000)再减去节偏移地址
  1. 文件偏移地址 = 相对偏移地址 - 装载基址 - 节偏移地址
  2.                    = 0x00401578 - 0x00400000 - (0x00001000 - 0x0000400)
  3.                    = 0x978
复制代码

  • 计算得到这条指令在距离文件开始处的978h,用16进制编辑器进行修改
Hex Workshop


  • 将.exe文件用hex wordshop打开,ctrl+g搜索978(16进制),将值74(JE)修改为75(JNZ),保存后重新运行可执行文件(可能会将.exe变成.bak文件,将.bak后缀修改为.exe运行即可)


  • 运行结果如下,当输入正确密码"1234567"后,反而会被提示错误


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表