19 Desember 2016 - 01:04:49 - Read: 499

Assembly First Code, Hello World!

Yarp, masih seputar CTF.

Kategori CTF yang paling dihindari para pemain baru di dunia CTF adalah kategori Reversing Binary. Karena proses disassemble terkadang tidak menampilkan source code aslinya. Toh kalaupun source code nya didapatkan, terkadang kita tidak bisa memahami alur dari source code tersebut karena bahasa pemrograman yang tidak kita kuasai. Karena masalah inilah, sehingga tools-tools ajib seperti IDA, Radare, gdb, gdb-peda dll pun menjadi tidak berguna.

Sebagai contoh, jika sebuah file binary yang dibuat menggunakan bahasa C yang sudah diproteksi melalui proses kompresi, absfucation, dll, yang di-disassemble, output paling pasti yang kita dapatkan adalah sebuah code dalam bahasa pemrograman assembly. Berbagai cara dilakukan para pemain untuk bisa mendapatkan pencerahan tentang file binary yang ingin di-solving. Mulai dengan meng-cat, meng-strings, meng-ltrace, sambil berharap mendapatkan clue dalam bentuk "teks". Sayangnya sebagian besar task tidak sesederhana ini. :)

Daripada kita menebak-nebak, kenapa kita tidak sekalian saja belajar bahasa pemrograman Assembly?

Mungkin sebagai pemula, kita tidak pernah tahu output dalam bentuk assembly yang akan kita temui nantinya, tapi setidaknya, dengan terus berlatih, setidaknya ada satu dua baris yang bisa kita pahami :)

Yarp, sebagai permulaan, mari kita coba saja membuat sebuah program "Hello World!" dengan assembly.

Artikel di https://www.tutorialspoint.com/assembly_programming/assembly_basic_syntax.htm menyebutkan

An assembly program can be divided into three sections −

  • The data section,

  • The bss section, and

  • The text section.

Entahlah apa maksudnya? :D

Mari kita copy paste saja penjelasannya :p

The data Section

The data section is used for declaring initialized data or constants. This data does not change at runtime. You can declare various constant values, file names, or buffer size, etc., in this section.

The syntax for declaring data section is −

section.data

The bss Section

The bss section is used for declaring variables. The syntax for declaring bss section is −

section.bss

The text section

The text section is used for keeping the actual code. This section must begin with the declaration global _start, which tells the kernel where the program execution begins.

The syntax for declaring text section is −

section.text
   global _start
_start:

Saat ini aku belum bisa menjelaskan secara detail maksud dari penjelasan diatas, karena tujuan utama artikel kali ini adalah berhasil dulu membuat sebuah program sederhana. Pelajari coding setelahnya.

Jika kalian merasa perlu memahami teori dulu sebelum mulai praktek, tidak masalah. Beda programmer, beda cara belajar.

Mungkin buat beberapa programmer, perlu mengetahui terlebih dahulu maksud dari eax, ebx, ecx, edx, mov, dll. Tapi sekali lagi, mari kita coba copy paste saja dulu sebuah contoh source code yang sudah ada. :)

section	.text
   global _start     ;must be declared for linker (ld)
	
_start:	            ;tells linker entry point
   mov	edx,len     ;message length
   mov	ecx,msg     ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	eax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
msg db 'Hello, world!', 0xa  ;string to be printed
len equ $ - msg     ;length of the string

Simpan dengan nama "hello.asm"

Baris code diatas adalah bahasa pemrograman assembly pertama kita, yang akan menampilkan output "Hello, world!". Berikutnya kita compile dengan "nasm"

$ man nasm

NAME
       nasm - the Netwide Assembler, a portable 80x86 assembler

SYNOPSIS
       nasm [-@ response file] [-f format] [-o outfile] [-l listfile] [options...]
       filename

DESCRIPTION
       The nasm command assembles the file filename and directs output to the file
       outfile if specified. If outfile is not specified, nasm will derive a default
       output file name from the name of its input file, usually by appending ‘.o’ or
       ‘.obj’, or by removing all extensions for a raw binary file. Failing that, the
       output file name will be ‘nasm.out’.

$ nasm -f elf hello.asm
$ ls
hello.asm  hello.o

Ternyata perintah "nasm" akan menghasilkan sebuah file baru dengan nama hello.o. Yarp, 1 hal sudah kita pelajari disini. Berikutnya menurut tutorial, kita akan membuat file hello.o menjadi file binary agar bisa dieksekusi.

$ ld -m elf_i386 -s -o hello hello.o
$ ls
hello  hello.asm  hello.o
$ ./hello
Hello, world!
$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

Yarp, sebuah file binary 32-bit berhasil kita buat. Lalu bagaimana jika kita ingin menjadikan file source code assembly diatas menjadi file 64-bit binary?

$ cp hello.asm hello-64.asm
$ nasm -f elf64 hello-64.asm
$ ls
hello  hello-64.asm  hello-64.o  hello.asm  hello.o
$ ld -s -o hello-64 hello-64.o
$ ls
hello  hello-64  hello-64.asm  hello-64.o  hello.asm  hello.o
$ ./hello-64
Hello, world!
$ file hello-64
hello-64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

Yarp, kita juga telah berhasil membuat file binary 64-bit tanpa mengetahui proses-proses apa yang sebenarnya terjadi disana :D

Tulisan ini hanya sebagai permulaan, kita akan membahas hal-hal lain seputar Assembly di artikel-artikel berikutnya.

/me brb, belajar dulu