软件漏洞分析:crack小实验

本文出自个人博客:软件漏洞分析:crack小实验

开始正式研究软件漏洞分析,首先学习一下基本知识,看的书是《0day安全:软件漏洞分析技术》,在本书的第一章的结尾是一个crack小实验,在这里记录一下实验过程。

首先自己写一段C语言的小代码,为下一步的crack提供资源,代码的主要功能是炎症密码的正确性,并进行跳转,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include
#include
 
#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 \r\n" );
         }
         else
         {
             printf ( "congratulation!" );
             break ;
         }
     }
}

下面需要对该代码进行破解,使得输入错误的密码也能验证通过,思路就是找到跳转的指令修改其跳转的条件。具体步骤如下:
为了修改跳转的方式,首先需要找到该指令在文件中的位置,但是我们通过反汇编软件看到的是其在内存中的位置,并不是文件中的位置,因此,需要进行内存地址到文件地址之间的换算,原理方法见另一篇文章,因此需要做的就是查看指令的虚拟偏移量,指令的装载基址(默认为0×00400000),和.data节的偏移量。

找到跳转指令,使用的工具是IDA(打开vs2010生成的exe文件),查看程序的基本框架图,找到跳转指令(jz),如下图

查看指令的虚拟内存地址,将鼠标放在上面框架中跳转指令(jz)上面,按空格得到指令位于的节和虚拟地址(.text:00411487),如下图

计算节偏移,具体原理见pe文件概述,使用的软件是LordPE(打开vs2010生成的EXE文件),得到每个节的详细信息,在此用到的是Voffset(节的虚拟内存偏移地址)roffset(节的文件偏移地址),然后相减得到节的偏移地址,本例中为0×00011000-0×00000400=0x10C00,如下图

得出跳转指令的文件偏移地址,根据公式(虚拟内存地址-装载基址-节偏移)0×411487-0×00400000-0x10C00=0×887。

修改指令,使用UltraEdit打开EXE文件,找到0×887对应的机器码,可以看到为74(正好吻合jz的机器码,说明正确),将这个修改为75(jnz跳转,跟jz正好想反),如下图,修改完成后另存为即可。再次运行软件发现原来的正确密码1234567反而成为了错误密码,其他均为正确密码。

以上内容基于阅读《0day安全:软件漏洞分析》后个人理解


你可能感兴趣的:(软件漏洞分析)