Görev basit: Makine kodunda yalnızca yazdırılabilir görünür ASCII karakterleri 0x21 ... 0x7e (boşluk ve del'e izin verilmez) kullanarak x86 (32 bit) ve x86-64 (64 bit) içinde farklı dallara ayrılan bir program yazın .
- Koşullu toplamaya izin verilmez.
- API çağrılarının kullanılmasına izin verilmiyor.
- Çekirdek modu (ring 0) kodunun kullanılmasına izin verilmiyor.
- Kod, Linux'ta veya başka bir korumalı mod işletim sisteminde IA-32 ve x86-64'te istisnalara neden olmadan çalışmalıdır.
- İşleyişi komut satırı parametrelerine bağlı olmamalıdır.
- Tüm talimatlar sadece 0x21 ... 0x7e (33 ... 126 ondalık) aralığındaki ASCII karakterleri kullanılarak makine kodunda kodlanmalıdır. Örneğin; kendi kendini değiştiren kod kullanmadığınız sürece
cpuid
sınırların0f a2
dışındadır. - Aynı ikili kod x86 ve x86-64'te çalıştırılmalıdır, ancak dosya başlıkları (ELF / ELF64 / vb.) Farklı olabileceğinden, yeniden birleştirmeniz ve bağlamanız gerekebilir. Ancak, ikili kod değişmemelidir.
- Çözümler i386 ... Core i7 arasındaki tüm işlemcilerde çalışmalıdır, ancak daha sınırlı çözümlerle de ilgileniyorum.
- Kod 32 bit x86'da dallanmalıdır, ancak x86-64'te değil veya tam tersi olmalıdır, ancak koşullu atlamaların kullanılması bir zorunluluk değildir (dolaylı atlama veya çağrı da kabul edilir). Şube hedef adresi, bazı kodlar için kısa bir atlayışın (
jmp rel8
) sığdığı en az 2 bayt boşluk olacak şekilde olmalıdır.
Kazanan cevap, makine kodunda en az bayt kullanan cevaptır. Dosya başlığındaki baytlar (örneğin ELF / ELF64) sayılmaz ve daldan sonraki herhangi bir kod baytı (test amacıyla vb.) Sayılmaz.
Lütfen cevabınızı ASCII, onaltılık bayt ve yorumlanmış kod olarak sunun.
Benim çözümüm, 39 bayt:
ASCII: fhotfhatfhitfhutfhotfhatfhitfhut_H3<$t!
onaltılık: 66 68 6F 74 66 68 61 74 66 68 69 74 66 68 75 74 66 68 6F 74 66 68 61 74 66 68 69 74 66 68 75 74 5F 48 33 3C 24 74 21
.
Kod:
; can be compiled eg. with yasm.
; yasm & ld:
; yasm -f elf64 -m amd64 -g dwarf2 x86_x86_64_branch.asm -o x86_x86_64_branch.o; ld x86_x86_64_branch.o -o x86_x86_64_branch
; yasm & gcc:
; yasm -f elf64 -m amd64 -g dwarf2 x86_x86_64_branch.asm -o x86_x86_64_branch.o; gcc -o x86_x86_64_branch x86_x86_64_branch.o
section .text
global main
extern printf
main:
push word 0x746f ; 66 68 6f 74 (x86, x86-64)
push word 0x7461 ; 66 68 61 74 (x86, x86-64)
push word 0x7469 ; 66 68 69 74 (x86, x86-64)
push word 0x7475 ; 66 68 75 74 (x86, x86-64)
push word 0x746f ; 66 68 6f 74 (x86, x86-64)
push word 0x7461 ; 66 68 61 74 (x86, x86-64)
push word 0x7469 ; 66 68 69 74 (x86, x86-64)
push word 0x7475 ; 66 68 75 74 (x86, x86-64)
db 0x5f ; x86: pop edi
; x86-64: pop rdi
db 0x48, 0x33, 0x3c, 0x24
; x86:
; 48 dec eax
; 33 3c 24 xor edi,[esp]
; x86-64:
; 48 33 3c 24 xor rdi,[rsp]
jz @bits_64 ; 0x74 0x21
; branch only if running in 64-bit mode.
; the code golf part ends here, 39 bytes so far.
; the rest is for testing only, and does not affect the answer.
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jmp @bits_32
@bits_64:
db 0x55 ; push rbp
db 0x48, 0x89, 0xe5 ; mov rbp,rsp
db 0x48, 0x8d, 0x3c, 0x25 ; lea rdi,
dd printf_msg ; [printf_msg]
xor eax,eax
mov esi,64
call printf
db 0x5d ; pop rbp
NR_exit equ 60
xor edi,edi
mov eax,NR_exit ; number of syscall (60)
syscall
@bits_32:
lea edi,[printf_msg]
mov esi,32
call printf
mov eax,NR_exit
int 0x80
section .data
printf_msg: db "running in %d-bit system", 0x0a, 0