Q:在開機後,在0x10000c設breakpoint,以"x/24x %esp"觀察附近的記憶體,確認何處是stack,以及每一個非零值的意義。
Ans:觀察到此時的暫存器與記憶體為
(gdb) info reg
eax 0x0 0
ecx 0x0 0
edx 0x1f0 496
ebx 0x10074 65652
esp 0x7bbc 0x7bbc
ebp 0x7bf8 0x7bf8
esi 0x0 0
edi 0x1126fc 1124092
eip 0x10000c 0x10000c
eflags 0x46 [ PF ZF ]
cs 0x8 8
ss 0x10 16
ds 0x10 16
es 0x10 16
fs 0x0 0
gs 0x0 0
(gdb) x/24x $esp
0x7bbc: 0x00007dc4 0x00000000 0x00000000 0x00000000
0x7bcc: 0x00000000 0x00000000 0x00000000 0x00000000
0x7bdc: 0x00010074 0x00000000 0x00000000 0x00000000
0x7bec: 0x00000000 0x00000000 0x00000000 0x00000000
0x7bfc: 0x00007c4d 0x8ec031fa 0x8ec08ed8 0xa864e4d0
0x7c0c: 0xb0fa7502 0xe464e6d1 0x7502a864 0xe6dfb0fa
Ans:觀察到此時的暫存器與記憶體為
(gdb) info reg
eax 0x0 0
ecx 0x0 0
edx 0x1f0 496
ebx 0x10074 65652
esp 0x7bbc 0x7bbc
ebp 0x7bf8 0x7bf8
esi 0x0 0
edi 0x1126fc 1124092
eip 0x10000c 0x10000c
eflags 0x46 [ PF ZF ]
cs 0x8 8
ss 0x10 16
ds 0x10 16
es 0x10 16
fs 0x0 0
gs 0x0 0
(gdb) x/24x $esp
0x7bbc: 0x00007dc4 0x00000000 0x00000000 0x00000000
0x7bcc: 0x00000000 0x00000000 0x00000000 0x00000000
0x7bdc: 0x00010074 0x00000000 0x00000000 0x00000000
0x7bec: 0x00000000 0x00000000 0x00000000 0x00000000
0x7bfc: 0x00007c4d 0x8ec031fa 0x8ec08ed8 0xa864e4d0
0x7c0c: 0xb0fa7502 0xe464e6d1 0x7502a864 0xe6dfb0fa
紅字部份為bootblock在bootasm.S的部份,對照bootblock.asm即可一一對應(BIOS會將first sector載入0x7c00)。
藍字部份是stack,其中7c4d是從bootasm呼叫bootmain時所推進stack的EIP進入。接著觀察bootblock.asm,可發現進入bootmain以後,依序推入ebp、edi、esi、ebx、並擴展stack(sub $0x2c,%esp),接著又呼叫entry(),所以又推入一個EIP,全部相加起來,共需17 words(17x4 = 68 = 0x44 bytes),所以進入entry()(breakpoint 0x10000c)後,esp為0x7c00 - 0x44 = 0x7bbc。
留言
張貼留言