# 构造极小的ELF ## 前言 在利用Dirty-Pipe漏洞时,由于漏洞限制只能写小于1k的数据,直接gcc编译的elf显然不满足要求,本文记录一下在尽可能不用人工修改二进制文件数据的情况下生成尽可能小的elf。 ## 生成流程 使用pwntools生成汇编代码: ```python import pwn pwn.context.clear() pwn.context.arch = "amd64" sc = pwn.shellcraft.amd64.linux.cat( "/etc/passwd" ) sc += pwn.shellcraft.amd64.linux.exit( 0 ) print( sc ) ``` 整理可得汇编代码: ```asm BITS 64 GLOBAL _start SYS_open equ 2 SYS_sendfile equ 0x28 SYS_exit equ 0x3c SECTION .text _start: push 0x1010101 ^ 0x647773 xor dword [rsp], 0x1010101 mov rax, 0x7361702f6374652f push rax push SYS_open pop rax mov rdi, rsp xor esi, esi syscall mov r10d, 0x7fffffff mov rsi, rax push SYS_sendfile pop rax push 1 pop rdi cdq syscall xor edi, edi push SYS_exit pop rax syscall ``` 之后通过如下编译方式得到二进制文件: ```shell $ nasm -f elf64 -o catflag.o catflag.asm $ ld --omagic -melf_x86_64 --strip-all -o catflag catflag.o ld: warning: catflag has a LOAD segment with RWX permissions $ wc -c catflag 400 catflag ``` 参数`--omagic` 为了禁止对其页面数据,不将`.text`段设置为只读。 ## 相关问题 其实到此我们已经得到一个小于1k且能在linux下运行的二进制文件了。但还有如下两个问题:1. 这种方式生成的二进制文件无法在WSL1中运行。2. 文件还可以更小。 解决问题1之前我们先来看下去掉`--omagic`参数后文件大小与文件结构: ```shell $ ld -melf_x86_64 --strip-all -o catflag catflag.o $ wc -c ./catflag 4368 ./catflag $ xxd ./catflag 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 00000010: 0200 3e00 0100 0000 0010 4000 0000 0000 ..>.......@..... 00000020: 4000 0000 0000 0000 5010 0000 0000 0000 @.......P....... 00000030: 0000 0000 4000 3800 0200 4000 0300 0200 ....@.8...@..... 00000040: 0100 0000 0400 0000 0000 0000 0000 0000 ................ 00000050: 0000 4000 0000 0000 0000 4000 0000 0000 ..@.......@..... 00000060: b000 0000 0000 0000 b000 0000 0000 0000 ................ 00000070: 0010 0000 0000 0000 0100 0000 0500 0000 ................ 00000080: 0010 0000 0000 0000 0010 4000 0000 0000 ..........@..... 00000090: 0010 4000 0000 0000 3a00 0000 0000 0000 ..@.....:....... 000000a0: 3a00 0000 0000 0000 0010 0000 0000 0000 :............... 000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ .... 00000ff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00001000: 6872 7665 0181 3424 0101 0101 48b8 2f65 hrve..4$....H./e 00001010: 7463 2f70 6173 506a 0258 4889 e731 f60f tc/pasPj.XH..1.. 00001020: 0541 baff ffff 7f48 89c6 6a28 586a 015f .A.....H..j(Xj._ 00001030: 990f 0531 ff6a 3c58 0f05 002e 7368 7374 ...1.j............. 00000020: 4000 0000 0000 0000 d000 0000 0000 0000 @............... 00000030: 0000 0000 4000 3800 0100 4000 0300 0200 ....@.8...@..... 00000040: 0100 0000 0500 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: ba00 0000 0000 0000 ba00 0000 0000 0000 ................ 00000070: 0010 0000 0000 0000 0000 0000 0000 0000 ................ 00000080: 6872 7665 0181 3424 0101 0101 48b8 2f65 hrve..4$....H./e 00000090: 7463 2f70 6173 506a 0258 4889 e731 f60f tc/pasPj.XH..1.. 000000a0: 0541 baff ffff 7f48 89c6 6a28 586a 015f .A.....H..j(Xj._ 000000b0: 990f 0531 ff6a 3c58 0f05 002e 7368 7374 ...1.j............. 00000020: 4000 0000 0000 0000 d000 0000 0000 0000 @............... 00000030: 0000 0000 4000 3800 0100 4000 0000 0000 ....@.8...@..... 00000040: 0100 0000 0500 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: ba00 0000 0000 0000 ba00 0000 0000 0000 ................ 00000070: 0010 0000 0000 0000 0000 0000 0000 0000 ................ 00000080: 6872 7665 0181 3424 0101 0101 48b8 2f65 hrve..4$....H./e 00000090: 7463 2f70 6173 506a 0258 4889 e731 f60f tc/pasPj.XH..1.. 000000a0: 0541 baff ffff 7f48 89c6 6a28 586a 015f .A.....H..j(Xj._ 000000b0: 990f 0531 ff6a 3c58 0f05 ...1.j