Dasar assembly x86


Saya lanjutkan pembahasan buku Joshua Saxe, masih tentang assembly x86.

CPU Register

Register adalah unit penyimpanan kecil dimana CPU x86 melakukan komputasi. Register terletak didalam CPU, sehingga aksesnya jauh lebih cepat dibandingkan memori. Disini dilakukan penghitungan arithmetic dan condition testing instructions. CPU menggunakan register untuk menyimpan informasi tentang status program yang dijalankan. Walaupun ada banyak jenis register, namun Saxe hanya fokus pada satu register yaitu general-purpose register

general-purpose register

General purpose register seperti scratch space bagi programmer assembler. Pada sistem 32-bit, setiap register ini memiliki space 32 bit, 16 bit atau 8 bit. Disini biasanya dilakukan perhitungan aritmetik, operasi bitwise, operasi byte order-swapping, dll. Alur komputasi umumnya adalah:

  1. program memindahkan data ke register dari memori atau dari Harddisk,
  2. melakukan beberapa operasi pada data tersebut
  3. Memindahkan data kembali ke memori untuk penyimpanan

Contohnya untuk melakukan sorting pada sebuah daftar panjang, sebuah program mengambil daftar item dari sebuah array di memori, membandingkan mereka di register dan menulis hasil perbandingan kembali ke memori.

Model dari general-purpose register pada arsitektur 32 bit dapat dilihat pada gambar diatas. Sumbu Vertikal menunjukan layout dari general-purpose register dan sumbu horizontal menunjukan bagaimana EAX, EBX, ECX dan EDX dibagi. EAX, EBX ECX dan EDX adalah register 32 but yang memilii register 16 bit didalamnya yaitu: AX, BX, CX dan DX. register 16 bit ini bisa dibagi lagi menjadi register 8 bit atas (High) dan bawah (Low) yaitu: AH, AL, BH, BL, CH, CL, DH dan DL. 

Stack dan Control Flow Registers

Stack management register menyimpan informaasi penting tentang program stack, yang merupakan tempat penyimpanan variabel lokal untuk functions, arguments yang dikirim ke functions dan control information yang berhubungan dengan program control flow.

Register ESP menunjuk kepada stack function paling atas yang sedang dijalankan, sementara register EBP menunjuk kepada stack paling bawah dari function yang sedang dijalankan. Info ini penting bagi program , karena dengan melakukan referensi data kepada stack dibandingkan alamatnya, kode prosedural dan objek oriented dapat mengakses variabel lokal secara lebih efisien. 

Walaupun kita tidak dapat melihat referensi langsung ke register EIP pada kode asembler x86, hal ini penting pada proses analisa, terutama pada riset vulnerability dan pembuatan exploit buffer overflow. EIP mengandung alamat memori dari instruksi yang sedang dijalankan. Penyerang dapat menggunakan exploit buffer overflow untuk membuat nilai register EIP corrupt secara tidak langsung dan mengendalikan eksekusi program.

EIP  penting pada proses analisa malware. Menggunakan debugger kita dapat menguji nilai EIP pada saat tertentu, sehingga kita dapat memahami apa yang sedang dilakukan malware pada saat itu.

EFLAGS adalah sebuah status register yang berisikan flags CPU, yaitu bits yang menyimpan status dari program yang dijalankan. Register EFLAGS adalah inti dari proses pembuatan conditional branches, atau perubahan dari execution flow yang dihasilkan dari logik if/then pada program x86. Ketika program menemukan bahwa sebuah nilai lebih besar atau lebih kecil dari 0 dan menjalankan sebuah fungsi berdasarkan pengujian nilai ini, register EFLAGS akan berperan. Pembahasan lanjutan tentang hal ini 

Instruksi Aritmetic

Instructions berjalan pada general-purpose registers. Kita dapat melakukan komputasi pada general purpose register menggunakan instruksi arithmetic. Contohnya add, sub, inc, dec dan mul. Contoh instruksi aritmetic:

  • add ebx, 100   : Menambahkan 100 pada nilai EBX dan disimpan hasilnya di EBX
  • sub ebx, 100 : mengurangi 100 pada nilai di EBX dan simpan hasilnya di eBX
  • inc ah : increment nilai di AH dengan 1
  • dec al : decrement nilai di AL dengan 1

instruksi add menambah 2 integer dan menyimpan hasilnya pada operand yang ditentukan, yaitu lokasi memori atau sebuah register. Hanya satu argumen yang disimpan pada lokasi memori. Instruksi inc melakukan incremen sebuah register atau nilai integer lokasi memori, sementara dec melakukan decrement sebuah register atau nilai integer lokasi memori

Data movement instructions

Prosesor x86 menyediakan beberapa instruksi untuk memindahkan data antara register dan memori. Instruksi ini adalah mekanisme dasar untuk mengubah data. Intruksi pokok untuk memindahkan data adalah mov. Contoh instruksi mov:

  • mov ebx,eax : Memindahkan nilai pada register EAX ke register EBX
  • mov eax, [0x12345678] : memindahkan data pada alamat memori 0x12345678 ke register EAX
  • mov edx, 1 : memindahkan nilai 1 ke register EDX
  • mov [0x12345678, eax : memindahkan nilai EAX ke lokasi memori 0x12345678

Selain instruksi mov, istruksi lea digunakan untuk melakukan load alamat memori ke register yang digunakan untuk mendapatkan sebuah pointer ke sebuah lokasi memori. Contohnya lea edx, [esp-4] mengurangi 4 dari nilai di ESP dan melakukan load hasilnya ke EDX.

Referensi:

Saxe, J., & Sanders, H. (2018). Malware Data Science: Attack Detection and Attribution. No Starch Press.

 

 

,

Silahkan tuliskan tanggapan, kritik maupun saran