Ekrana OK(tamam) yazan programi 100 bayt altina dusurme cabalari!

Başlatan 7hr33l3t73r, 24 Ekim 2015 - 14:17:32

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

7hr33l3t73r

Title:"Ekrana OK(tamam) yazan programi 100 bayt altina dusurme cabalari!"
Merhabalar,
Aslinda bu yaziya tartisma sonucu mu? diyelim.Yoksa baska  birsey mi? bilemedim.Ortaya  bir fikir atildi.Bizde denemeye karar verdik.
<- Biraz bos vaktimiz olmaya gorsun.Hemen bos isler pesinde kosuyoruz. :) ->
Uc, bes harfi ekrana yazdiran programi, 100 bayt'in altina nasil dusurebiliriz, dedik.
Boyle soyleyince biraz sacma oldu. :)
Aslinda hello yazdiracaktik ama yaziyi sonuna kadar okuyunca basaramadigimizi goreceksiniz. Bizde OK kelimesin de karar verdik.
Ekrana isi sadece hello yazmak olan bir programin boyutunu ne kadar dusurebiliriz.(Hedef 100 bayt alti :( )
<-ASM->
Tabi burada herkesin ASM'e bas vurmak aklina gelecektir.(Biz OK icin  hata alsak da ASM ile ulastik)
Biz GNU derleyecisini de ele aldik.
GCC ile derledigimiz yazilimlari evirdik cevirdik.

~/asm/smallbayt
$ file hellogcc
hellogcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=561b2a486b90a881e15caf905ff052e9b783314b, stripped
~/asm/smallbayt
$ wc -c hellogcc
404 hellogcc
$ ./hellogcc
Hello

404 bandina kadar dusurduk.
GNU derleyicisinin build-id sini de kaldirdigimiz zaman 344 bayt bandini gorduk.Biraz daha ugrasilirsa daha da duser ama 100 bayt alti zor.
Tabi GCC ile umitsiz oldugumuzdan fazla ustunu gitmeyelim dedik.
GCC ile amacimiza ulasamadik.Zaten bizde biliyorduk, olmayacagini ama bir bakalim dedik ne kadar dusurebiliriz diye. :)
ASM'e derleyicisine basvuralim dedik. Ne varsa ASM de vardir diye :)

Bu arada yurudugumuz kod soyle birsey.

;File hello.asm
mov ecx, $hello
mov dl, 6
mov al, 4
mov bx, 1
int 80h
mov al, 1
int 80h



~/asm/smallbayt
$ file helloasm
helloasm: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
~/asm/smallbayt
$ wc -c helloasm
114 helloasm
~/asm/smallbayt
$ ./helloasm
Hello

Kodu biraz daha kisaltarak derledigimizde (cikis kodunu iptal ettik) 110 bayt bandina geriledik ama hata aldik. :)
Sonra hatayi da kabul ederek daha da dusurmek adina OK kelimesini kullanmaya karar verdik.(Hello kelimesi isimize gelmedi diyelim)

~/asm/smallbayt
$ wc -c helloasm1
110 helloasm1
~/asm/smallbayt
$ ./helloasm1
Hello
[1]    21814 segmentation fault (core dumped)  ./helloasm1

Kodu duzenleyerek tekrar denedik.

;File ok.asm
mov ecx, $ok
mov dl, 3
mov al, 4
mov bx, 1
int 80h
mov al, 1
int 80h


Bu sefer 111 bayt bandina dusurduk.

~/asm/smallbayt
$ wc -c ok
111 ok
~/asm/smallbayt
$ ./ok
OK

Cikisi iptal ettigimiz de 107 bayt bandina geriledik ama hata aldik haliyle ama olsun sonucta kabul etmistik. :)
Bir turlu  100 bayt altina dusememistik.

$ wc -c ok2
107 ok2
~/asm/smallbayt
$ ./ok2
OK
[1]    8881 segmentation fault (core dumped)  ./ok2

Son bir hamle ile tekrar duzenleme yaptik ve bu sefer 97 bayt bandina kadar dusurduk. :)

push 0x0a4b4f ;string "OK\n" stack'e gonder.
mov ecx, esp  ;stack'ten ECX'e
mov dl, 3     ;string: Boyun kac.
mov al, 4     ;Syscall, Yaz Kizim, 10 kamyon kum.
int 0x80      ;O kedi(kernel) buraya gelecek.

Ama tabi hatadan kurtulamadik. :)

~/asm/smallbayt
$ wc -c ok.bin
97 ok.bin
~/asm/smallbayt
$ ./ok.bin
OK
[1]    14048 segmentation fault (core dumped)  ./ok.bin

Sizin de denemeler yapmaniz adina, yazilimi paylasiyorum. :)

~/asm/smallbayt
$ perl -e 'print "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00\x01\x00\x00\x00\x54\x80\x04\x08\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x20\x00\x01\x00\x28\x00\x00\x00\x00\x00\x01\x00\x00\x00\x54\x00\x00\x00\x54\x80\x04\x08\x54\x80\x04\x08\x0d\x00\x00\x00\x0d\x00\x00\x00\x07\x00\x00\x00\x00\x10\x00\x00\x68\x4f\x4b\x0a\x00\x89\xe1\xb2\x03\xb0\x04\xcd\x80"' > ok.bin
~/asm/smallbayt
$ chmod +x ok.bin
[code]
~/asm/smallbayt
$ file ok.bin
ok.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

Daha da dusuren olursa, haber etsin buradan.Biz amacimiza ulasinca biraktik. :)
50 bayt bandi gorulur mu? Bilemem ama:) 97'nin altina dusurulebilir sanirim.
Gelelim yaziyi niye hazirladigima.
Belki yazi birilerinin ilgisini ceker, denemeler yaparlar ve 97'nin  altina dusebilirler.
Eger harf yerine, rakam kullansaydik.Farkli bir yontem ile 45 bayt bandina dusebilirdik. :)

~/asm/smallbayt
$ perl -e 'print "\x7f\x45\x4c\x46\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x20\x00\x01\x00\x20\x00\x01\x00\x04\x00\x00\x00\xb3\x2d\x31\xc0\x40\xcd\x80\x00\x34\x00\x20\x00\x01"' > 45.bin
~/asm/smallbayt
$ chmod +x 45.bin
~/asm/smallbayt
$ file 45.bin
45.bin: ELF 32-bit invalid byte order (SYSV)
~/asm/smallbayt
$ wc -c 45
45 45
~/asm/smallbayt
$ ./45.bin;echo $?
45

<- Kapat camerayi :) ->
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Amenofis

Programdan kastının ne olduğuna bağlı. Sadece opcode lardan oluşan bir dosyayı harici bir program ile çalıştırırsan en kısa şekilde halletmiş olursun. Fakat program şeklinde olacaksa işletim sistemi ek bilgiler, başlıklar isteyecek, bu da boyutu arttıracak.

7hr33l3t73r

Derlenebilir yazilimlar deseymisim keske.Daha anlasilir olurdu. :(
Yazilimlari sitelere yuklemek yerine opcodlari(internetsiz PC) ile paylasmak mantikli geldi.
Boyutlari cok kucuk diye tercih ettim.
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html