1. 程式人生 > 其它 >【reverse】逆向3 尋找地址

【reverse】逆向3 尋找地址

【reverse】逆向3 尋找地址

定址公式一:[立即數]

讀取記憶體的值:

mov eax,dword prt ds:[0x13FFC4]

將記憶體編號為0x13FFC4、0x13FFC5、0x13FFC6、0x13FFC7的資料寫入eax中

向記憶體中寫入資料

mov dword prt ds:[0x13FFC4],eax

將eax的資料寫入記憶體編號為0x13FFC4、0x13FFC5、0x13FFC6、0x13FFC7中

獲取記憶體編號

lea eax,dword ptr ds:[0x13FFC4]
lea eax,dword prt ds:[edx]

獲取0x13FFC4地址的記憶體編號(就是0x13FFC4)

獲取edx的記憶體編號

定址公式二:[reg]

reg代表暫存器,可以是8個通用暫存器中的任意一個

讀取記憶體的值:

# 基址
mov ecx,0x13FFD0
# 找基址的資料
mov eax,dword prt ds:[ecx]

其實這個尋找公式的本質和第一個一樣,只不過第一個是直接讀取記憶體編號的資料

而這個是先把要找的記憶體地址放入一個暫存器中,在根據暫存器中儲存的記憶體編號去尋找這個記憶體編號的資料

舉個例子

第一句彙編將記憶體編號0x19FF74存入ecx中

第二句彙編將存入ecx中的記憶體編號的資料讀取出來

我們先在堆疊視窗觀察0019FF74編號的資料為7725FA29

我們執行第一句彙編

可以看到我們把0019FF74編號存入了ecx中

再執行第二句彙編

可以看到我們把0019FF74編號中的資料讀到了eax中

向記憶體中寫入資料

mov edx,0x13FFD8
mov dowrd ptr ds:[edx],0x87654321

向0x13FFD8這個記憶體編號中寫入0x87654321這個資料

獲取記憶體編號

mov eax,0x19FF74
lea ecx,dword ptr ds:[eax]

讀取eax的記憶體編號(這裡eax的記憶體編號是0x19FF74)

執行第一句彙編前

執行第一句彙編後,將0x19FF74記憶體編號存入eax

執行第二句彙編後,ecx中獲取了eax的記憶體編號0x19FF74

定址公式三:[reg+立即數]

讀取記憶體中的值

mov ecx,0x19FF74
mov eax,dword ptr ds:[ecx+0x4]

公式3和公式2其實一樣,只不過多了一個立即數的偏移量

第一句彙編是將0x19FF74記憶體編號存入ecx

第二句彙編是將ecx+0x4(0x19FF78)的記憶體編號的資料放入eax中

執行前的資料狀況

執行第一句

執行第二句

可以發現eax中存入了0x0019FF78這個記憶體編號

向記憶體中寫入資料

mov ecx,0x19FF74
mov dword prt ds:[ecx+0xC],0x87654321

向記憶體編號為0x19FF74+0xC寫入0x87654321的資料

獲取記憶體編號

lea eax,dword ptr ds:[ecx+0x8]

我們看這張圖

lea是讀取ecx+0x8的記憶體編號

而ecx是0x19FF74

所以如果運行了這句彙編,那麼eax的那裡將會存入0x19FF7C的記憶體編號

定址公式四:[reg+reg*{1,2,4,8}]

讀取記憶體的值

mov eax,0x13FFC4
mov ecx,0x2
mov edx,dword ptr ds:[eax+ecx*4]

第一句彙編,將0x13FFC4記憶體編號寫入eax

第二句彙編,將0x2立即數寫入ecx

第三句彙編,將eax+ecx*4(0x13FFC4+0x8 = 0x13FFCC)記憶體編號的資料寫入edx

題外話:eax+ecx*4不會超過FFFFFFFF

向記憶體中寫入資料

mov eax,0x13FFC4
mov ecx,0x2
mov dword ptr ds:[eax+ecx*0x4],0x87654321

第一句彙編,將0x13FFC4記憶體編號寫入eax

第二句彙編,將0x2立即數寫入ecx

第三句彙編,將eax+ecx*4(0x13FFC4+0x8 = 0x13FFCC)記憶體編號的值改為0x87654321

獲取記憶體編號

mov eax,0x13FFC4
mov ecx,0x2
lea eax,dword ptr ds:[eax+ecx*4]

第一句彙編,將0x13FFC4記憶體編號寫入eax

第二句彙編,將0x2立即數寫入ecx

第三句彙編,將eax+ecx*4(0x13FFC4+0x8 = 0x13FFCC)記憶體編號寫入eax,此時eax就是0x13FFCC

定址公式五:[reg+reg*{1,2,4,8}+立即數]

讀取記憶體的值

mov eax,0x13FFC4
mov ecx,0x2
mov edx,dowrd ptr ds:[eax+ecx*4+0x4]

第一句彙編,將0x13FFC4記憶體編號寫入eax

第二句彙編,將0x2立即數寫入ecx

第三句彙編,將eax+ecx*4+0x4(0x13FFC4+0x8+0x4 = 0x13FFD0)記憶體編號的資料寫入edx

向記憶體中寫入資料

mov eax,0x13FFC4
mov ecx,0x2
mov dowrd ptr ds:[eax+ecx*4+0x4],0x87654321

第一句彙編,將0x13FFC4記憶體編號寫入eax

第二句彙編,將0x2立即數寫入ecx

第三句彙編,將eax+ecx*4+0x4(0x13FFC4+0x8+0x4 = 0x13FFD0)記憶體編號的資料改為0x87654321

獲取記憶體編號

mov eax,0x13FFC4
mov ecx,0x2
lea eax,dword ptr ds:[eax+ecx*4+0x4]

讀取eax+ecx*4+0x4這個記憶體編號,也就是0x13FFD0