Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Mari Belajar Bahasa Assembly #2
23-07-2013, 12:38 AM,
Post: #1
Mari Belajar Bahasa Assembly #2
Untuk siri kedua, kita akan belajar untuk memanggil dan menyimpan data ke dalam memori. x86 architecture ada beberapa mode, tapi modern OS macam Windows, GNU/Linux, OS X, dan lain-lain akan guna Protected Mode yang menyokong penggunaan virtual memory. Kalau kita load/attach 2 program/proses, program A dan program B ke dalam debugger dalam masa yang serentak, kita akan dapati kedua menggunakan alamat memory yang sama, contohnya 0x00400000 ataupun 0x01000000 yang digunakan oleh notepad.exe and calc.exe. Ini kerana kedua-dua proses tersebut telah di-virtualized-kan dan tidak akan berlaku pertindihan data. Program A tidak boleh mencapai data dalam program B secara terus dan sebaliknya. Walau bagaimana pun, program A boleh mencapai data program B dengan menggunakan teknik-teknik yang tertentu contohnya API ReadProcessMemory().

[Image: deBhKNG.png]

Dalam siri ini, kita akan menggunakan platform windows, oleh itu kita mesti memahami sedikit sebanyak mengenai for PE, iaitu format executable bagi windows. PE ialah extension kepada DOS format (MZ). PE data structure mengandungi banyak maklumat untuk executable seperti Entry Point, Import dan Export, Sections dan sebagainya. PE ialah subjek yang agak luas, buat sementara waktu kita hanya akan memerhatikan *Section* sebab ianya akan dimuatkan ke dalam memory secara teratur mengikut maklumat yang terdapat dalam PE header.

[Image: 8ngJC82.png]

Kalau kita tengok kepada notepad.exe, ianya mengandungi 3 sections, section yang pertama ialah .text yang mengandungi codes, .data untuk menyimpan global memory, dan .rsrc (resource) untuk menyimpan pelbagai resource termasuklan icon, dialogbox, menu, grafik dan lain-lain. Ketiga-tiga section ini mempunyai access mode yang berbeza, R(ead) E(xecute), R(ead)W(rite), dan R(ead). Oleh kerana .text section tidak mempunyai access W, maka kita tidak boleh menyimpan sebarang data ke dalam section tersebut semasa program berjalan dan begitulah seterusnya.

[Image: VKfMx7V.png]

Berbalik kepada pencapaian memory, dalam bahasa pengaturcaraan C/C++, kita sedia maklum mengenai local variable dan global variable, tetapi tahukah anda dimana variable-variable ini disimpan? Jawapannya, global variable disimpan di dalam section data yang mempunyai RW access dan local variable di dalam stack. Stack ialah ruangan memory *sementara* yang disediakan khas untuk setiap program atau process.

Sebagai contoh untuk program C/C++ dibawah,
Code:
int global1 = 3;
int main()
{
  int local1 = 1;
  int local2 = 2;
  int total = local1 + local2 + global1;
  return 0;
}

Semasa dijalankan, iaitu akan kelihatan begini;

[Image: tX0qD5p.png]

Local variable akan disediakan semasa program memasuki function main() dengan menggunakan arahan "SUB ESP, 0C". 0x0C ialah 12, ini bermakna 3 local variables yang setiap satunya bersaiz 4 bytes and disediakan (allocate) dan akan dimusnahkan selepas program keluar daripada function tersebut, melalui arahan "MOV EBP, ESP". Maka tidak hairanlah mengapa local variable tidak boleh dicapai oleh function lain.

Lain pula dengan global variable, ianya sentiasa berada dalam data section, dan boleh dicapai oleh semua function dengan menggunakan alamat yang tetap, sebagai contoh untuk program diatas, di lokasi 0x407030.

Dengan menggunakan Flat Assembler, kita boleh tulis balik program di atas dengan menggunakan bahasa assembly seperti berikut;

Code:
format PE console
entry permulaan
include 'win32a.inc'

section '.text' code readable executable

permulaan:
    call main
    ret

proc main         ; start function/procedure macro
    locals        ; start locals macro
    .local1 dd ?  ; can't assign local variable at compile time
    .local2 dd ?
    .total  dd ?
    endl          ; end local macro

    mov dword [.local1],1 ; assign local variable
    mov dword [.local2],2
    mov eax,dword [.local1]
    add eax,dword [.local2]
    add eax,dword [global1]
    mov [.total],eax
    xor eax,eax           ; return 0
    ret
endp              ; end function/procedure macro

section '.data' data readable writeable
global1 dd 0x3

; tak perlu section resource

Sebagai latihan, sila assemble/compile program di atas dengan menggunakan Fasm dan debug dengan menggunakan ollydbg untuk melihat hasilnya untuk memahami bagaimana stack frame berfungsi.

Untuk bacaan lanjut:
http://en.wikibooks.org/wiki/X86_Disasse...ack_Frames
http://yurichev.com/writings/RE_for_beginners-en.pdf

Jangan Keliru:
Untuk memudahkan kita membaca disassembly listing, Ollydbg secara default akan cuba menafsirkan local variable, contohnya:
Code:
0040100C  |.  C745 F4 01000 MOV DWORD PTR SS:[LOCAL.3],1
Codes yang sebenarnya ialah:
Code:
0040100C  |.  C745 F4 01000 MOV DWORD PTR SS:[EBP-0C],1
Setting ini boleh ditukar:
-> Options -> Analysis -> Untick Show recognized ARGs and LOCALs in disassembly.
Reply
24-07-2013, 06:08 AM,
Post: #2
RE: Mari Belajar Bahasa Assembly #2
oh, patutla tak lepas nak copy value dari stack, sbb dia dah dimusnahkan rupanya.
dah paham dah pasal local/global.

pasal API ReadProcessMemory() masih blur2 lagi cara nak guna API tu,
code yg kat
Code:
http://www.mpgh.net/forum/31-c-c-programming/261563-readprocessmemory.html
boleh dijadikan rujukan tak utk guna api readprocessmemory?
Reply
24-07-2013, 12:12 PM,
Post: #3
RE: Mari Belajar Bahasa Assembly #2
Boleh je rujuk mana-mana pun.. ReadProcessMemory ada kembar dia, WriteProcessMemory yang boleh digunakan utk hot patching/hooking, code injection dan lain-lain.

Trivia:
https://blogs.msdn.com/b/oldnewthing/arc...ected=true
http://www.codeproject.com/Articles/4610...her-Proces
Reply


Possibly Related Threads...
Thread Author Replies Views Last Post
  Mari Belajar Bahasa Assembly #1 smael 10 1,071 22-06-2013, 03:28 PM
Last Post: Syahmie
  Jom belajar cracking penguinkecewa 9 3,142 10-03-2013, 10:31 PM
Last Post: Tron
  software untuk buat assembly phoenix 8 2,423 07-09-2012, 05:33 PM
Last Post: hexrut
Question Notes, Tutorials and Assembly Language Programming 127001 1 906 19-05-2011, 01:21 PM
Last Post: sil
  website to learn assembly 4c3p0k3r 6 1,649 05-05-2011, 10:15 AM
Last Post: hotfloppy
  Assembly Language Programming 8085 farrell 6 1,929 22-01-2011, 10:23 AM
Last Post: farrell
  Belajar basic Assembly Code yg digunakan dalam cracking (ASM cupin06 24 5,857 29-11-2010, 01:47 PM
Last Post: jokerjr

Forum Jump: