2015-11-04 52 views
0

在確定x86中二進制炸彈實驗室的特定區段時遇到了一些麻煩。裝配 - 二進制炸彈

0x08048ce8 <+0>: sub $0x1c,%esp 
0x08048ceb <+3>: movl $0x804a4e4,(%esp) 
0x08048cf2 <+10>: call 0x804917b <string_length> 
0x08048cf7 <+15>: add $0x1,%eax 
0x08048cfa <+18>: mov %eax,(%esp) 
0x08048cfd <+21>: call 0x8048870 <[email protected]> 
0x08048d02 <+26>: movl $0x776f7242,(%eax) 
0x08048d08 <+32>: movl $0x2c65696e,0x4(%eax) 
0x08048d0f <+39>: movl $0x756f7920,0x8(%eax) 
0x08048d16 <+46>: movl $0x65726120,0xc(%eax) 
0x08048d1d <+53>: movl $0x696f6420,0x10(%eax) 
0x08048d24 <+60>: movl $0x6120676e,0x14(%eax) 
0x08048d2b <+67>: movl $0x63656820,0x18(%eax) 
0x08048d32 <+74>: movl $0x666f206b,0x1c(%eax) 
0x08048d39 <+81>: movl $0x6a206120,0x20(%eax) 
0x08048d40 <+88>: movl $0x2e626f,0x24(%eax) 
0x08048d47 <+95>: movb $0x62,0xc(%eax) 

我不確定movoc指令在malloc之後做了什麼。當我嘗試檢查gdb中的地址時,我得到「無法訪問內存......」。那麼這些舉措的重點是什麼?

編輯

感謝您對malloc部分的幫助。我仍然卡住,但這是直接在上面的部分。

mov %eax,0x4(%esp) <== moves string loaded into malloc to esp 
mov 0x20(%esp),%eax <== takes user input and move to eax 
mov %eax,(%esp)  <== moves that user input back into esp? 
call 0x804919a <strings_not_equal> 
+1

'%eax'包含_malloc_返回的指針。所有這些舉措都將即時數據值轉移到malloc的內存區域。這些值似乎是文本編碼爲32位整數。 4個字節的文本可以適合32位值。 'movl $ 0x776f7242,(%eax)'例如似乎將0x42,0x72,0x6f,0x77的ascii字符(記得我們是小端,所以順序反轉)到malloc'ed內存的前4個字節區。 –

+0

'mov%eax,0x4(%esp)'將'%eax'中的32位值移動到0x04 +%esp開始的內存位置。 'mov 0x20(%esp),%eax'移動從內存位置%esp + 0x20開始的32位值並將它們放入%eax。 'mov%eax,(%esp)'將%eax中的值移動到0x00 +%esp開始的內存位置。我建議你看看一些關於[80386尋址模式]的文檔(https://en.wikipedia.org/wiki/X86#Addressing_modes),也許https://cs.nyu.edu/courses/fall10/V22.0201- 002/addressing_modes.pdf –

回答

0

在malloc之後,EAX持有指向最近配對的內存的基指針。隨後的每一個movl都將雙字常量移動到EAX,並帶有適當的偏移量。所以很明顯,movl只是將數據加載到最近的malloc'd區域。