0day安全:软件漏洞分析技术(第二版) 例子一

2019-07-28  本文已影响0人  一只老不上架的鸭子

 书中摘抄的代码如下,编译后的EXE文件,实现了简单的密码校验的功能。此次实验的目的,是按照书中的描述,修改EXE文件,使输入非匹配的密码可以通过验证。

#include <stdio.h>

#include <string.h>

#define PASSWORD "1234567"

int verify_password (char *password)

{           

    int authenticated;

    authenticated=strcmp(password,PASSWORD);

    return authenticated;

}

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("incorrect password!\n\n");

        }else

        {

            printf("Congratulation! You have passed the verification!\n");

            break;

        }

    }

}

使用Dev-C++ 5.11进行编译,编译的时候选择32位程序发布,编译生成文件0day_test1.exe:

图一

该程序运行效果如下:

图二

使用IDA静态反编译工具打开该EXE文件,找到匹配PASSWORD的判断分支指令,尝试修改EXE的代码逻辑为:PASSWORD匹配失败跳转到原来的密码比较成功逻辑分支,实现输入非匹配密码可以通过验证。

图三

在该指令上按空格切换命令界面,获取该指令的VA地址

图四

得到该指令的VA地址在.text段的00401578,可以看到得到的VA地址和原书中描述的地址并不一样。

.text:00401578                 jz      short loc_401588

关掉VA,使用管理员权限打开ollydbg,打开0day_test1.exe:

然后使用CTRL+G直接跳转到上述的VA地址

图五

双击该指令,将原本的“JE SHORT 00401588”改成“JNE SHORT 00401588”

图六

可以看到指令已经被改:

图七

目前被被改的仅仅是内存中的指令,需要写到EXE文件中。书中使用原始的方式在EXE文件中找到指令并修改,由于ollydbg有现成的功能实现这个功能。

单击该指令,右键--Edit--Copy to executable

图八

弹出窗口提醒保存文件,确认OK。然后从窗口选择保存文件

图九 图十

运行破解的EXE文件,可以发现输入错误密码可以通过认证。

图十一

上面使用ollydbg实现PE文件(EXE文件)的格式修改,下面实验手工查找PE文件中的执行指令。

使用PE Explorer打开PE文件

图十二

EXE文件的代码段.text段,内存装载基地址(Image Base)=00401000

指令的虚拟内存地址(VA)=00401578

.text段文件中偏移地址 = 00000400 

计算指令的文件偏移地址

指令在文件偏移地址=虚拟内存地址(VA)- 装载基址(Image Base)+.text段文件中偏移地址

=00401578-00401000+00000400 

=978

使用WinHex直接跳到指令在文件偏移地址:

图十三 图十四

改成:

图十五

保存文件,并运行:

上一篇下一篇

猜你喜欢

热点阅读