Linux CTF 逆向入门

LinuxCTF逆向入门2.可执行头部(ExecutableHeader)

ELF文件的第一部分是可执行文件头部(ExecutableHeader),其中包含有关ELF文件类型的信息。ELF文件在各种平台下都通用,ELF文件有32位版本和64位版本,其文件头内容是一样的,只不过有些成员的大小不一样。它的文件图也有两种版本:分别叫“Elf32_Ehdr”和“Elf64_Ehdr”。这里以32位版本为例:

readelf-h/bin/lsELFHeader:Magic:7f454c46020101000000000000000000Class:ELF64Data:2'scomplement,littleianVersion:1(current)OS/ABI:UNIX-SystemVABIVersion:0Type:DYN(Sharedobjectfile)Machine:AdvancedMicroDevicesX86-64Version:0x1Entrypointaddress:0x6130Startofprogramheaders:64(bytesintofile)Startofsectionheaders:137000(bytesintofile)Flags:0x0Sizeofthisheader:64(bytes)Sizeofprogramheaders:56(bytes)Numberofprogramheaders:11Sizeofsectionheaders:64(bytes)Numberofsectionheaders:29Sectionheaderstringtableindex:28

我们可以使用以下计算方法来计算整个二进制文件的大小:

size=e_shoff+(e_shnum*e_shentsize)

size=Startofsectionheaders+(Numberofsectionheaders*Sizeofsectionheaders)

size=137000+(29*64)=138856计算结果验证:

3、程序头部(ProgramHeaders)

程序头部是描述文件中的各种segments(段),用来告诉系统如何创建进程映像的。

typedefstruct{Elf32_Wordp_type;/*Segmenttype*/Elf32_Offp_offset;/*Segmentfileoffset*/Elf32_Addrp_vaddr;/*Segmentvirtualaddress*/Elf32_Addrp_paddr;/*Segmentphysicaladdress*/Elf32_Wordp_filesz;/*Segmentsizeinfile*/Elf32_Wordp_memsz;/*Segmentsizeinmemory*/Elf32_Wordp_flags;/*Segmentflags*/Elf32_Wordp_align;/*Segmentalignment*/}Elf32_Phdr;
5、表(Section)5.2.dataSection

保存已初始化的数据。

5.4.textSection

本节包含程序的实际代码,逻辑流程。使用查看ELF文件表结构readelf

6、完成简单的CTF挑战

既然已经对ELF文件有所了解了,那找一个CTF题目来试试吧。

二进制文件下载地址:

国内下载:

1、运行这个程序,并传递一些随机字符给它,得到的结果如下:

stringsnix_5744af788e6cbdb29bb41e8b0e5f3cd5/lib/;GCC:()8.2.0

我们可以看到“%c”是打印flag的字符串,数量是15个。

3、我们可以查看“.rodata”部分的偏移量,可以更好的查看这些字符

nm-Dnix_5744af788e6cbdb29bb41e8b0e5f3cd5w__cxa_finalizeUexitw__gmon_start__00002004R_IO_stdin_usedw_ITM_deregisterTMCloneTablew_ITM_registerTMCloneTableU__libc_start_mainUprintfUputsUsprintfUstrlen

说明:-D或–dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义我们可以发现这些函数未定义。5、跟踪系统调用(SystemCalls)我们可以使用之类的工具去跟踪程序的系统调用printf,puts,sprintf,

ltrace-i-C./nix_5744af788e6cbdb29bb41e8b0e5f3cd5aaaaaaaa[0x565570e1]__libc_start_main(0x565571e9,2,0xffe3a584,0x56557400unfinished[0x56557249]strlen("aaaaaaaa")=8[0x565572ca]puts("\n[+]Noflagforyou.[+]"[+]Noflagforyou.[+])=26[0xffffffffffffffff]+++exited(status26)+++

6、反编译".text"部分让我们看一下.text部分的反汇编并尝试理解

513336743C8353S9963c11573s404EOT2014DC43624$523446844D8454T10064d11674t505ENQ2115NAK3725%533556945E8555U10165e11775u606ACK2216SYN3826543667046F8656V10266f11876v707BEL2317ETB3927'553777147G8757W10367g11977w808BS2418CAN4028(563887248H8858X10468h12078x909HT2519EM4129)573997349I8959Y10569i12179y100ALF261ASUB422A*583A:744AJ905AZ1066Aj1227Az110BVT271BESC432B+593B;754BK915B[1076Bk1237B{120CFF281CFS442C,603C764CL925C\1086Cl1247C|130DCR291DGS452D-613D=774DM935D]1096Dm1257D}140^1106En1267E~150FSI311FUS472F/633F?794FO955F_1116Fo1277FDEL

然后我们将字符作为输入,执行程序即可得到FLAG

7、说明

面向初学者的Linux逆向工程CTF|奥桑达

参考:

ELF文件结构描述-yooooooo-博客园

发布于 2025-06-07
129
目录

    推荐阅读