首页 > 编程语言 >谜题:打造极小ELF文件输出文件(使用汇编语言通过系统调用来实现)

谜题:打造极小ELF文件输出文件(使用汇编语言通过系统调用来实现)

时间:2022-11-08 01:00:32浏览次数:47  
标签:tmp 文件 root ELF mov 谜题 open rax a77ugr2f

接上文《谜题:打造极小ELF文件输出文件(通过C语言来实现)》

在本篇中,我们要写出一段直接通过系统调用的方式、且使用尽可能少的指令的汇编代码来实现目标。

  1. 可以省略的代码,就省略。例如,在准备系统调用的参数时,若寄存器中已有需要的内容,则无需重复赋值。
  2. 能使用低位寄存器,就使用低位寄存器。例如,假设rax已经清空,赋值一个小于,就可以给al赋值,可节省相应的机器指令长度。
  3. 系统调用sys_exit的返回值可以不为零。

根据以上思路,经过一番努力,我们得到了以下汇编代码。

open.s
.section .bss
.equ bufSIZE, 65535
.lcomm buf, bufSIZE

.section .text
.globl _start

_start:
// 2 sys_open(const char *filename, int flags, int mode)
//xor %rax, %rax
mov $0x2, %al
mov 16(%rsp),%rdi;
//mov $0x0, %rsi
syscall

// 0 sys_read(unsigned int fd, char *buf, size_t count)
mov %rax, %rdi
xor %rax, %rax
mov $buf, %esi
mov $bufSIZE, %dx
syscall

// 1 sys_write(unsigned int fd, const char *buf, size_t count)
mov %rax, %rdx
xor %rax, %rax
mov $0x1, %al
xor %rdi, %rdi
mov $0x1, %dil
syscall

// 3, sys_close(unsigned int fd)
xor %rax, %rax
mov $0x3, %al
syscall

// 60, sys_exit(int error_code)
mov $0x3c, %al
//xor %rdi, %rdi
syscall

通过as命令汇编,ld命令链接,我们得到了64位ELF格式的可执行文件,大小952字节。

[root@i-a77ugr2f tmp]# as open.s -o open.o
[root@i-a77ugr2f tmp]# ld open.o -o open
[root@i-a77ugr2f tmp]# ll open
-rwxr-xr-x 1 root root 952 Nov  6 22:48 open
[root@i-a77ugr2f tmp]# ./open /etc/passwd
# 可以正常输出

通过查阅资料发现,节区表对ELF可执行文件的运行是没有任何影响的,因此可以直接删除。这里我们使用现成的工具sstrip来实现。

# 编译安装sstrip
[root@i-a77ugr2f tmp]# git clone https://github.com/BR903/ELFkickers
[root@i-a77ugr2f tmp]# cd ELFkickers/sstrip/
[root@i-a77ugr2f tmp]# make
[root@i-a77ugr2f tmp]# cp sstrip /usr/bin/

# 删除ELF可执行文件的节区表
[root@i-a77ugr2f tmp]# sstrip open
[root@i-a77ugr2f tmp]# ll open
-rwxr-xr-x 1 root root 232 Oct 19 11:15 open
[root@i-a77ugr2f tmp]# ./open /etc/passwd
# 可以正常输出

到这里,我们获得了一个232字节的ELF可执行文件。

标签:tmp,文件,root,ELF,mov,谜题,open,rax,a77ugr2f
From: https://www.cnblogs.com/cathonzhd/p/16864550.html

相关文章

  • 谜题:打造极小ELF文件输出文件(在Linux环境中精简ELF64文件)
    接前文《谜题:打造极小ELF文件输出文件(使用汇编语言通过系统调用来实现)》在完成了一个232字节的程序后,发现距离186字节的目标还是有一些距离。接下来就要深入研究ELF文件的......
  • Django限制用户上传文件格式与大小
    https://blog.csdn.net/weixin_42134789/article/details/100012339Django模型中自带的ImageField和FileField字段并不会也不能限制用户上传的图片或文件的格式和大小,这给......
  • 如何基于原名称批量重命名(格式化)文件(夹)名
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z 现在需要把这些文档的文件名处理,格式为:4位数字-6位数字-10位数字,办法如下:打开工具 切换到......
  • 目录下各文件夹的作用
    .gz是linux压缩格式bin是启动关闭的脚本文件conf配置文件lib依赖jar包logs日志文件webapps存放网站src是源码文件在conf->server.xml(服务器核心配置文件)中: 1.配置启......
  • Qt - 实现压缩文件、文件夹和解压缩操作
    一、前言        QZipWriter是用来压缩文件的类,需要在安装Qt是选择Sources源码安装。否则,无法使用QZipWriter。1.QZipWriter详解1.1构造方法:QZipWriter(cons......
  • 第11周 预习报告:流与文件
    程序可以处理的数据来源除了文件还有哪些?对不同的数据来源共同的操作是什么?①还可以是控制台的输入。联机下的网络上的数据。②数据的读写将对不同数据源中数据的读写......
  • ASP .NET Core 访问共享文件夹
    ASP.NETCore访问Windows共享目录安装Neget包Install-PackageSharpCifs.StdCodeSampleusingSharpCifs.Smb;usingSystem.IO;usingSystem.Linq;namespace......
  • Minio分布式文件存储
    packagewangbiao.config.minio;importcom.fasterxml.jackson.core.JsonProcessingException;importio.minio.*;importio.minio.errors.*;importio.minio.messag......
  • R3下用ZwQueryObject/ZwDuplicateObject关闭互斥体和解除文件占用
      不少程序在运行时会创建/打开全局Mutex,来限制用户多开。百度上搜一圈下来,他们的实现基本是这样:intmain(intargc,char*argv[]){HANDLEhMtx=CreateMutex(NULL......
  • Createprocess 输入输出重定向到文件
    当要执行一些系统命令完成一些任务时,会调用Createprocess/system/_popen。后两者运行时会出现cmd对话框窗口,有碍观瞻。Createprocess也有同样问题,但是可以通过cmd/CComman......