软件安全——Crack二进制文件

0x00 写在前面

  • 这只是一次简单的PE文件破解实验,大佬勿喷;同是小白的朋友有问题可以在评论区文明讨论。
  • 代码十分简单,源码如下:
#include 
#include 
#define PASSWORD "1234567"

int verify_password(char* password)
{
    int authenticated;
    authenticated = strcmp(password, PASSWORD);
    return authenticated;
}

int main()
{
    int valid_flag = 0;
    char password[1024];
    while(1)
    {
        printf("Please input password:  ");
        scanf("%s", password);

        valid_flag = verify_password(password);
        if (valid_flag)
        {
            printf("Incurrent password!\n\n");
        }
        else
        {
            printf("Congratulation! You have passed the verification!\n");
            break;
        }
    }
   	return 0;
}
  • 下面就是假装不知道源码的情况下的破解流程。

0x01 实验流程

  • 拿到这个文件第一件事情肯定是丢到虚拟机里打开先看一下效果:

软件安全——Crack二进制文件_第1张图片

  • 从运行结果我们大概就能想到解决办法——把用于比较的语句的效果去除掉就好了;这样我们应该能瞬间想到几个办法,比如直接把判断语句删除掉、把判断的条件构造成恒为真等等。
  • 用IDA打开文件,我们先找到main函数,然后理一下逻辑定位到判断点。(这个地方IDA直接把password翻译出来了,我们为了实验忽略它)

软件安全——Crack二进制文件_第2张图片
软件安全——Crack二进制文件_第3张图片

  • 在这里我们按空格键查看汇编代码 (如果是比较复杂的程序的话可以考虑用F5反汇编一下看看代码结构)
    软件安全——Crack二进制文件_第4张图片
  • 下面就是本程序的跳转关键代码。到这个地方按照老师提供的方案的话会比较麻烦,其实是有捷径的,我这里就走捷径了。(老师复杂的办法是为了让我们多学习一点东西,其实还是有点为自己的投机取巧羞愧的>_<)
repe cmpsb
jnz     short loc_401C60
  • 这里我考虑的是用 nop 指令填充 jnz 指令:将光标定位到 jnz 指令上,然后切换到 Hex View 标签页
    软件安全——Crack二进制文件_第5张图片

  • 百度一下 nop 指令的机器吗是 90h

  • jnz 指令处右键 -> 编辑(Edit…)
    软件安全——Crack二进制文件_第6张图片

  • 将指令修改掉,然后保存修改(Apply changes)
    软件安全——Crack二进制文件_第7张图片

  • 这时我们已经把指令修改好了,切换回 IDA View 标签页瞄一眼
    软件安全——Crack二进制文件_第8张图片

  • 你以为到这里就结束了,不,还差最后一步:把修改好的东西保存回硬盘
    软件安全——Crack二进制文件_第9张图片

  • 看看效果
    软件安全——Crack二进制文件_第10张图片

你可能感兴趣的:(软件安全)