Segmen-Segmen Program di Dalam Memori :
* Data Segment (Data + BSS + Heap)
* Stack
* Code segment atau bisa juga disebut segment text
Secara lebih detail :
- Segmen .text
Bagian kode-kode eksekusi program utama yang akan diload ke memori, di mana section ini merupakan read only
-Segmen .data
Bagian ini merupakan bagian untuk pendeklarasian variabel dengan ukuran yang sudah fix.
-Segmen .bss
Bagian ini merupakan bagian deklarasi variabel yang tidak diisi. misal:
-------------
section .bss
nm: resw 10
-------------
- Daerah Heap
Bagian heap dimulai di akhir segment .bss
- Segmen stack
Bagian ini bekerja dengan sistem LIFO (Last in First Out), merupakan daerah yang menyimpan informasi sementara.
jika digambarkan kurang lebih seperti ini:
"It's ALL About LIFO (Last in First Out)"
untuk memahami cara kerja stack mari kita buat sample program dengan push (menyimpan ke stack):
"saatnya bertele tele sebentar"
-----------------------
global _start
section .text
_start:
push ebp
mov ebp,esp
push 'AAAA'
push 'BBBB'
push 'CCCC'
push 'DDDD'
push 'EEEE'
push 'FFFF'
push 'GGGG'
push 'HHHH'
push 1
pop eax
int 80h
-------------------------
lakukan kompile dengan opsi -g :
nasm -f elf stack.asm
ld -o stack stack.o
examine dengan gdb:
----------------------------------
mywisdom# gdb -q stack
(gdb) l
1 global _start
2 section .text
3 _start:
4 push ebp
5 mov ebp,esp
6 push 'AAAA'
7 push 'BBBB'
8 push 'CCCC'
9 push 'DDDD'
10 push 'EEEE'
(gdb) l
11 push 'FFFF'
12 push 'GGGG'
13 push 'HHHH'
14 push 1
15 pop eax
16 int 80h
(gdb) b 6
Breakpoint 2 at 0x8048083: file stack.asm, line 6.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/c/stack
Breakpoint 2, 0x08048083 in _start ()
(gdb) p $esp
$4 = (void *) 0xbfbfea30
(gdb) p $ebp
$5 = (void *) 0xbfbfea30
-----------------------
karena perintah:
--------------------------
mov ebp,esp
--------------------------
---------------------
(gdb) b 7
Breakpoint 1 at 0x8048088: file stack.asm, line 7.
(gdb) run
Starting program: /root/c/stack
Breakpoint 1, 0x08048088 in _start ()
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbfbfea2c 0xbfbfea2c
ebp 0xbfbfea30 0xbfbfea30
esi 0x0 0
edi 0x0 0
eip 0x8048088 0x8048088
eflags 0x202 514
cs 0x33 51
ss 0x3b 59
ds 0x3b 59
es 0x3b 59
fs 0x3b 59
gs 0x3b 59
(gdb)
---------------------
kita bisa lihat ada perubahan :
-----------------------------
esp 0xbfbfea2c (3217025580)
ebp 0xbfbfea30 (3217025584)
---------------------------
di sini kita bisa lihat dari top of stack telah dipush word pertama 'AAAA' :
---------------------------
(gdb) x/s 0xbfbfea2c
0xbfbfea2c: "AAAA"
(gdb)
--------------------------
push 'BBBB':
esp 0xbfbfea28 (3217025576)
ebp 0xbfbfea30 (3217025584)
(gdb) x/s 0xbfbfea28
0xbfbfea28: "BBBBAAAA"
(gdb)
------------
push "CCCC":
esp 0xbfbfea24 (3217025572)
ebp 0xbfbfea30 (3217025584)
(gdb) x/s 0xbfbfea24
0xbfbfea24: "CCCCBBBBAAAA"
(gdb)
---------------
push "DDDD"
esp 0xbfbfea20 (3217025568)
ebp 0xbfbfea30 (3217025584)
(gdb) x/s 0xbfbfea20
0xbfbfea20: "DDDDCCCCBBBBAAAA"
(gdb)
---------------------
push "EEEE"
esp 0xbfbfea1c (3217025564)
ebp 0xbfbfea30 (3217025584)
(gdb) x/s 0xbfbfea1c
0xbfbfea1c: "EEEEDDDDCCCCBBBBAAAA"
(gdb)
---------------
s/d HHHH:
esp 0xbfbfea10 (3217025552)
ebp 0xbfbfea30 (3217025584)
(gdb) x/s 0xbfbfea10
0xbfbfea10: "HHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA"
(gdb)
------------------
Dari gambaran di atas kita sudah mengetahui cara kerja stack dengan operasi push, saat terjadi push nilai esp setiap kali kita melakukan push selalu
bergeser ke alamat memori yang lebih kecil,
Selisih antara ebp dan esp ---- 0xbfbfea30-0xbfbfea10 = 20h = 32 desimal = jumlah karakter yang telah dipush.
selanjutnya kita akan melakukan tes pop :
misal kita edit program tadi kita tambahkan pop:
------------------------
global _start
section .text
_start:
push ebp
mov ebp,esp
push 'AAAA'
push 'BBBB'
push 'CCCC'
push 'DDDD'
push 'EEEE'
push 'FFFF'
push 'GGGG'
push 'HHHH'
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
pop eax
push 1
pop eax
int 80h
-------------------------
dengan : pop eax berarti kita memindahkan top stack ke register eax.