返回介绍

2.3 深度检测工具

发布于 2024-10-11 21:05:40 字数 4206 浏览 0 评论 0 收藏 0

到目前为止,我们已经讨论了一些工具,利用这些工具,可以在对文件的内部结构知之甚少的情况下对文件进行粗略分析,也可以在深入了解文件的结构之后,从文件中提取出特定的信息。在这一节中,我们将介绍一些专用于从任何格式的文件中提取出特定信息的工具。

2.3.1 strings

有时候,提出一些与文件内容有关的常规性问题,即那些不需要了解文件结构即可回答的问题,对我们会有一定帮助。例如:“这个文件包含字符串吗?”当然,在回答这个问题之前,必须先回答另一个问题:“到底什么是字符串?”我们将字符串简单定义为由可打印字符组成的连续字符序列。通常,在这一定义的基础上,还需要指定一个最小长度和一个特定的字符集。因此,可以搜索至少包含 4 个连续可打印 ASCII 字符的字符串,并将结果在控制台打印出来。通常,搜索这类字符串不会受到文件结构的限制。在 ELF 二进制文件中搜索字符串就像在微软 Word 文档中搜索字符串一样简单。

strings 实用工具专门用于提取文件中的字符串内容,通常,使用该工具不会受到文件格式的限制。使用 strings 的默认设置(至少包含 4 个字符的 7 位 ASCII 序列),可得到以下结果。

idabook#  strings ch2_example  
/lib/ld-linux.so.2  
__gmon_start__  
libc.so.6  
_IO_stdin_used  
exit  
srand  
puts  
time  
printf  
stderr  
fwrite  
scanf  
__libc_start_main  
GLIBC_2.0  
PTRh  
[^_]  
usage: ch2_example [max]  
A simple guessing game!  
Please guess a number between 1 and %d.  
Invalid input, quitting!  
Congratulations, you got it in %d attempt(s)!  
Sorry too low, please try again  
Sorry too high, please try again  

不过,我们发现,一些字符串看起来像程序输出,一些字符串则像函数名称或库名称。因此,绝不能仅仅根据这些字符串来断定程序的功能。分析人员往往会掉入陷阱,根据 strings 的输出来推断程序的功能。需要记住的是:二进制文件中包含某个字符串,并不表示该文件会以某种方式使用这个字符串。

下面是使用 strings 时的一些注意事项。

  • 需要牢记的是,使用 strings 处理可执行文件时,默认情况下, strings 仅仅扫描文件中可加载的、经初始化的部分。使用命令行参数 –a 可强制 strings 扫描整个文件。

  • strings 不会指出字符串在文件中的位置。使用命令行参数 –t 可令 strings 显示所发现的每一个字符串的文件偏移量信息。

  • 许多文件使用了其他字符集。使用命令行参数 –e 可使 strings 搜索更广泛的字符,如 16 位 Unicode 字符。

2.3.2 反汇编器

前面介绍过,有很多工具都可以生成二进制目标文件的死代码清单形式的反汇编代码。PE、ELF 和 MACH-O 文件可分别使用 dumpbinobjdumpotool 进行反汇编。但是,它们中的任何一个都无法处理任意格式的二进制数据块。有时候,你会遇到一些并不采用常用文件格式的二进制文件,在这种情况下,你就需要一些能够从用户指定的偏移量开始反汇编过程的工具。

有两个用于 x86 指令集的 流式反汇编器 (stream disassembler): ndisasmdiStorm 1ndisasm 是 Netwide Assembler(NASM )2 中的一个工具。下面的例子说明了如何使用 ndisasm 反汇编一段由 Metasploit 框架3 生成的 shellcode :

1 参见 http://www.ragestorm.net/distorm/
2 参见 http://nasm.sourceforge.net/
3 参见 http://www.metasploit.com/

idabook#  ./msfpayload linux/x86/shell_findport CPORT=4444 R > fs  
idabook#  ls -l fs  
-rw-r--r-- 1 ida ida 62 Dec 11 15:49 fs  
idabook#  ndisasm -u fs  
00000000  31D2              xor edx,edx  
00000002  52                push edx  
00000003  89E5              mov ebp,esp  
00000005  6A07              push byte +0x7  
00000007  5B                pop ebx  
00000008  6A10              push byte +0x10  
0000000A  54                push esp  
0000000B  55                push ebp  
0000000C  52                push edx  
0000000D  89E1              mov ecx,esp  
0000000F  FF01              inc dword [ecx]  
00000011  6A66              push byte +0x66  
00000013  58                pop eax  
00000014  CD80              int 0x80  
00000016  66817D02115C      cmp word [ebp+0x2],0x5c11  
0000001C  75F1              jnz 0xf  
0000001E  5B                pop ebx  
0000001F  6A02              push byte +0x2  
00000021  59                pop ecx  
00000022  B03F              mov al,0x3f  
00000024  CD80              int 0x80  
00000026  49                dec ecx  
00000027  79F9              jns 0x22  
00000029  52                push edx  
0000002A  682F2F7368        push dword 0x68732f2f  
0000002F  682F62696E        push dword 0x6e69622f  
00000034  89E3              mov ebx,esp  
00000036  52                push edx  
00000037  53                push ebx  
00000038  89E1              mov ecx,esp  
0000003A  B00B              mov al,0xb  
0000003C  CD80              int 0x80  

由于流式反汇编非常灵活,因此它的用途相当广泛。例如,在分析网络数据包中可能包含 shellcode 的计算机网络攻击时,就可以采用流式反汇编器来反汇编数据包中包含 shellcode 的部分,以分析恶意负载的行为。另外一种情况是分析那些不包含布局参考的 ROM 镜像。ROM 中有些部分是数据,其他部分则为代码,可以使用流式反汇编器来反汇编镜像中的代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文