x86 Linux 용 어셈블리, 106 바이트
BITS 32
org 0x2E620000
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
dd 0, 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $$ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
phdr: dd 1 ; e_phnum ; p_type
; e_shentsize
dd 0 ; e_shnum ; p_offset
; e_shstrndx
dd $$ ; p_vaddr
fname equ $ - 2
db 'out', 0 ; p_paddr
dd filesize ; p_filesz
dd filesize ; p_memsz
dd 5 ; p_flags
dd 0x1000 ; p_align
_start: mov al, 5 ; 5 = open syscall
mov ebx, fname
mov cl, 65 ; 65 = O_WRONLY | O_CREAT
mov dx, 666q
int 0x80
lea edx, [byte ecx + filesize - 65]
xchg eax, ebx
xchg eax, ecx
mov cl, 0
mov al, 4 ; 4 = write syscall
int 0x80
mov al, 1 ; 1 = exit syscall
int 0x80
filesize equ $ - $$
이것은 nasm 어셈블러를위한 것입니다. 명령 행을 사용하여 바이너리를 빌드하십시오.nasm -f bin -o a.out selfrep.asm && chmod +x a.out
다음은 16 진 덤프와 동일한 파일입니다. 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 62 2E 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 62 2E 6F 75 74 00 6A 00 00 00 6A 00 00 00 05 00 00 00 00 10 00 00 B0 05 BB 36 00 62 2E B1 41 66 BA B6 01 CD 80 8D 51 29 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
요청에 따라 프로그램은 자체 파일을 별도의 파일로 복사합니다. (stdout에 쓰고 사용자가 파일로 리디렉션하도록 허용하면 프로그램이 상당히 짧아 질 수 있습니다.)
크기를 줄이기 위해 경계선 트릭을 사용하지 않았습니다. 이것은 완전한 32 비트 ELF 바이너리 여야합니다.
추가 편집 : 위의 버전에서 생성 된 파일은 단순한 파일이지만 몇 바이트 (그리고 규칙의 작은 굴곡)에 대해 조금 더 흥미로운 것을 만들 수 있습니다. 이 버전은 108 바이트에서 2 바이트 만 더 깁니다.
BITS 32
org 0x00010000
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
dd 0, 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $$ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
phdr: dd 1 ; e_phnum ; p_type
; e_shentsize
dd 0 ; e_shnum ; p_offset
; e_shstrndx
dd $$ ; p_vaddr
fname: db 'asr', 0 ; p_paddr
dd filesize ; p_filesz
dd filesize ; p_memsz
dd 7 ; p_flags
dd 0x1000 ; p_align
_start: mov al, 5 ; 5 = open syscall
mov ebx, fname
inc byte [ebx]
mov cl, 65 ; 65 = O_WRONLY | O_CREAT
mov dx, 777q
int 0x80
lea edx, [byte ecx + filesize - 65]
xchg eax, ebx
xchg eax, ecx
mov cl, 0
mov al, 4 ; 4 = write syscall
int 0x80
mov al, 1 ; 1 = exit syscall
int 0x80
filesize equ $ - $$
이 버전의 이름 asr
을 "자기 복제기"로 지정하십시오.nasm -f bin -o asr asr.asm && chmod +x asr
nasm 장애가있는 16 진 덤프 버전 :
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 01 00 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 01 00 61 73 72 00 6C 00 00 00 6C 00 00 00 07 00 00 00 00 10 00 00 B0 05 BB 38 00 01 00 FE 03 B1 41 66 BA FF 01 CD 80 8D 51 2B 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
이 파일을 실행하면 이름이 거의 bsr
같지만 자체적으로 실행 가능한 파일이 생성됩니다. 이를 실행하면이라는 다른 이진 파일이 생성됩니다 csr
. 등등.
(성가신 일들은 이후에 시작됩니다 zsr
. 나는 이름 변경 등을 캐스케이드하는 버전을 만드는 것을 고려 atr
했지만 대부분의 사람들은 그 전에 지루해 질 것이라고 생각하므로 여분의 바이트가 모두 가치가 없을 것입니다. )