Linux内核级木马与病毒攻防:基础工具介绍

2020-07-08 16:23:48 浏览数 (1)

欲成其事先利其器。要想完成一项复杂的任务,工具的作用至关重要。要想在Linux系统上开发或研究木马病毒等特殊程序,我们需要使用一系列强大的开发和调试攻击。本节先介绍几种在Linux系统上极为强大的工具。

第一个当然是gdb了,在Linux上,它是唯一能用于程序调试的利器。我们后面开发代码或调试分析其他病毒或木马的设计模式和原理时,必须使用gdb作为手术刀,对要研究的病毒和木马进行”剖尸检验“,通过gdb调查木马或病毒的代码设计方法,同时也使用gdb加载恶意代码,研究其运转流程。

第二个是objdump,它的作用是将恶意代码所编制成的可执行文件内部信息抽取出来,例如如果病毒或木马最后编译成ELF格式的可执行文件,那么我们可以使用该工具将里面的各种信息展示出来,举个例子,使用C语言写一个helloworld程序如下:

代码语言:javascript复制
#include "stdio.h"
void main() {
    printf("hello world!");
}

然后使用gcc编译成可执行文件,命令如下:

代码语言:javascript复制
gcc  -Wall  -g  hello_world.c  -o  hello_world

注意到gcc也是在Linux上进行程序开发必不可少的编译器。执行上面代码后会在当前目录生成elf格式的可执行文件hello_world,然后使用如下命令打印其内部内容:

代码语言:javascript复制
objdump -D hello_world

执行后所得结果如下:

可以看到,ELF文件其实由很多”section”组成,它也称为”段”,了解这些段的作用就可以找到注入恶意代码的机会,或者当程序被加载运行时,可以扫描其内存结构从而获取有关程序的关键数据,例如制作外挂。

还有一个强大的工具就是objcopy,它能让我们非常方便的修改ELF文件中段的数据,这样我们甚至不需要写代码就能对ELF对应的程序进行劫持。它的使用方法如下:

代码语言:javascript复制
objcopy --only-section=.data  ./hello_world  hello_world_data

这个命令的作用是把infile对应的elf文件中数据段的内容复制到hello_world_data文件,后面我们会详细研究其作用和使用方法。

还有一个强力工具叫strace,它能追踪程序对系统API的调用情况,甚至能发现程序从文件中读取了那些数据,首先构建一个名为hello.txt的文本文件,里面包含一行字符串:“hello world!”,然后创建sys_read.c,在里面调用系统接口open和read来读取文件内容:

代码语言:javascript复制
void main() {
    int  fd = open("hello.txt", O_RDONLY);
    printf("fd is %d", fd);

    char  buffer[10];
    read(fd, &buffer, 10);
    printf(buffer);
}

然后使用gcc如前那样将其编译成格式为elf的可执行文件sys_read,接着调用如下命令:

代码语言:javascript复制
strace -c ./sys_read

然后可以看到如下信息,其中展示了程序对系统接口的调用情况统计:

使用如下命令可以查看程序在调用系统API Read 时读入的数据:

代码语言:javascript复制
strace -e read ./sys_read

执行后结果如下图:

可以看到read函数读入的内容被显示出来。另外一个类似工具叫ltrace,它的作用是能发现程序执行时加载了那些动态链接库,同时打印出程序对链接库内的函数调用。

如果要分析ELF可执行文件格式内容,一个必不可免的工具为readelf,它能有效读取elf文件内各种关键信息。该工具在后续章节中将会被大量使用。几个常用方法为:

代码语言:javascript复制
readelf - S ./sys_read

它读取可执行文件sys_read的段头表,该表的具体内容后面我们会介绍。

代码语言:javascript复制
readelf -s  ./sys_read

该命令读取可执行文件的符号表。

代码语言:javascript复制
readelf -r ./sys_read

该命令读取可执行文件的重定向入口。 在linux系统上还有一系列虚拟系统文件或设备能用于读取当前运行进程的各种重要信息,例如先运行ubuntu系统上的firefox程序,然后使用pidof firefox查看他对应的进程id,在我机器上其id为24869,然后准备执行几个关键命令:

代码语言:javascript复制
cat ./proc/24869/maps

如此可以读取该进程被加载运行时的内存布局和相关信息。同时文件/proc/kcore对应内核符号表,利用gdb加载该文件就可以对内核进行调试和分析。文件/proc/iomem对应内核在内存中的布局,例如它包含了内核代码段,内核数据段,内核bss段等重要段数据的加载和分布状况。这些工具和命令的更多用法将在后续相关章节中讲解和使用。

0 人点赞