Posted on 2008-09-27 16:59
沒畫完的畫 閱讀(1429)
評論(2) 編輯 收藏 引用 所屬分類:
Reverse Engineering & ASM
在第一集中,終于知道調用函數 func1() 之后,就分配了堆棧的空間,然后將堆棧空間的內容初始化為 0xCC
------------------------------------------------------------------------------------------------
6: int j;
7: char c;
8: short k;
9:
10: j = 0;
00401038 mov dword ptr [ebp-4],0
11: c = 'a';
0040103F mov byte ptr [ebp-8],61h
12: k = 1;
00401043 mov word ptr [ebp-0Ch],offset func1+27h (00401047)
13:
14: printf("sum=%d\n", input1+input2);
00401049 mov eax,dword ptr [ebp+8]
0040104C add eax,dword ptr [ebp+0Ch]
0040104F push eax
00401050 push offset string "sum=%d\n" (0042201c)
00401055 call printf (00401130)
0040105A add esp,8
15:
16: return;
17: }
0040105D pop edi
0040105E pop esi
0040105F pop ebx
00401060 add esp,4Ch
00401063 cmp ebp,esp
00401065 call __chkesp (004011b0)
0040106A mov esp,ebp
0040106C pop ebp
0040106D ret
------------------------------------------------------------------------------------------------
上面代碼為 將堆棧初始化為 0xCC 之后的代碼
程序是如何讀取 [函數內部的局部變量] 和 [入口參數] 的呢?
首先看下[入口參數],
在上一集,知道在調用 func1() 之前,參數已經 push 到堆棧了
ebp 為 棧內存基地址, 即棧底
esp 為 當前的棧頂地址
在內存中 棧底處于高地址,棧頂處于底地址
10: j = 0;
00401038 mov dword ptr [ebp-4],0 ; 放至于 [ebp] - 4 的地址
11: c = 'a';
0040103F mov byte ptr [ebp-8],61h ; 主至于 [ebp] - 8 的地址,這里雖然 c 只需占用一個字節,但實際上它占用了四個字節,
; 因為編譯器作了優化,傳說中的“字節對齊”
12: k = 1;
00401043 mov word ptr [ebp-0Ch],offset func1+27h (00401047)
當執行完 0040103F mov byte ptr [ebp-8],61h 后,
-------------------------------------------------------
EAX = CCCCCCCC EBX = 7FFD3000 ECX = 00000000
EDX = 00000002 ESI = 00000000 EDI = 0012FF14
EIP = 00401043 ESP = 0012FEBC EBP = 0012FF14
-------------------------------------------------------
0012FF06 CC CC CC CC CC CC 61 燙燙燙a
0012FF0D CC CC CC 00 00 00 00 燙.....
0012FF14 80 FF 12 00 E4 10 40 ......@
從內存的內容不難看出,c實際上占用了四個字節,而多余的三個字節依然還是 0xCC 的內容
在執行這一句之前,
mov word ptr [ebp-0Ch],offset func1+27h (00401047)
offset 是編譯器提供的偽指令,它不是真正的cpu指令,他被編譯器執行。
而 lea 是cpu指令,他被cpu執行。
一般情況下offset 跟mov連用的!而lea是直接使的!
mov dx, offset buf
lea dx, buf
---------------------------------------
編譯以后:
mov dx, 0004h ;相對地址
lea dx, [0061h] ;DS:[0061h]
突然發現匯編指令的尋址方式忘光了, offset 都忘記是干嘛的
好困,需要~~~需要先睡一會~~