首页
社区
课程
招聘
[旧帖] [翻译]42字节可执行文件;ELF介绍;求Kx(续) 0.00雪花
2012-9-22 11:57 1064

[旧帖] [翻译]42字节可执行文件;ELF介绍;求Kx(续) 0.00雪花

2012-9-22 11:57
1064
在使用nostartfiles之后,继续使用新的优化-nostdlib如何?
报错显示,_exit()毕竟还是一个系统调用,我们没有绕过标准库。但是,如果放弃可移植性,我们确实还是能做到不调用任何系统的函数,而顺利返回,但在那之前,我们需要了解Linux系统下,如何完成一个系统调用。

LInux系统为上层程序提供了系统调用,实现系统调用的指令是中断int 0x80。所有的系统调用都是通过这个中断实现。为了进行调用,eax需要保存调用号,其他的寄存器保存参数。如果系统调用只有一个参数,那么使用ebx寄存器,ecx,edx,esi,和edi则用于保存2,3,4,5个参数。调用返回时,eax保存返回值,如果调用失败,则eax中是一个负数。

系统调用对应的数字在文件/usr/include/asm/unistd.h。exit对应的系统调用是1,同样接受一个参数,保存在ebx中。
这样,我们不需要任何其他库函数就可以返回了。

;tiny.asm
BITS 32
GLOBAL _start
SECTION .text
_start:
                       mov eax,1
                       mov ebx,42
                       int    0x80

编译:
$ nasm -f elf tiny.asm
$gcc -s -nostdlib tiny.o
$./a.out; echo $?

大小为372字节。

比上一个版本小了四分之三。
(进一步的缩减,等晚上接着翻译。)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回