2011-12-09 22 views
1

我在.text段中有這個彙編代碼,有可能我不能加入一個位於.text區域的dword。如果我把一些DWORD,在.data段,它工作正常座位,我的意思是,當我切換線路:我可以在.text區域實現計數器而不使用寄存器嗎?

01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[1004A66],3E7

01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[.data:0100579C],3E7 



01004A66  0000   ADD BYTE PTR DS:[EAX],AL 
01004A68  0000   ADD BYTE PTR DS:[EAX],AL 
01004A6A  00    DB 00 
01004A6B  00    DB 00 
01004A6C  00    DB 00 
01004A6D  00    DB 00 
01004A6E  00    DB 00 
01004A6F  00    DB 00 
01004A70  00    DB 00 
01004A71  00    DB 00 
01004A72 > 813D 664A0001 >CMP DWORD PTR DS:[1004A66],3E7 
01004A7C . 74 06   JE SHORT winmine3.01004A84 
01004A7E  FF05 9C570001 INC DWORD PTR DS:[1004A66] 
01004A84 ^E9 CDD5FFFF JMP winmine3.01002056 
01004A89  0000   ADD BYTE PTR DS:[EAX],AL 
01004A8B  0000   ADD BYTE PTR DS:[EAX],AL 
01004A8D  0000   ADD BYTE PTR DS:[EAX],AL 
01004A8F  00    DB 00 
01004A90  00    DB 00 

回答

3

.text段只讀行部分。您應該使用.bss.datastack作爲可修改變量。

http://en.wikipedia.org/wiki/Code_segment

+0

win32中沒有「.text segment」。有'CS'寄存器選擇的代碼段,如果編譯(鏈接)不可寫,則可以有'.text'節,它可以是不可寫的。 – Abyx

+0

大多數編譯器調用入口點部分'.text',現在它被認爲是一個替代術語。 – Polynomial

2

.text區域通常是隻讀的,所以你不能寫結果吧。你可以用.data來代替,如果你真的想要的話,甚至可以用棧。

+0

...甚至堆,甚至任何其他可寫內存頁面,但這是彙編級別的問題,它是關於如何將數據保存在'.text'節中。 – Abyx

+0

當然,但你*不應該*具有'.text'可寫,正如我在你的答案中提到的。安全問題無數。 – Polynomial

0

您可以使用VirtualProtect函數使.text部分可寫。


UPD:有關的安全風險:
作爲@RaymondChen寫道,看了 - 寫 - 執行頁是不安全的。

攻擊者可以利用緩衝區溢出來覆蓋指向另一個緩衝區的指針,攻擊者的代碼將被複制到讀寫執行(RWX)頁面。

但是,當您使用軟件保護工具保護您的程序,或者僅使用UPX進行打包時,代碼部分將變爲可寫。而某些流行的商業保護者不會使其不可回寫。如果你的字典有一個加載到每個進程中的DLL,並且它有RWX部分,那就變得很有趣了。

我不想說,如果有很多「保護」程序不關心RWX內存,所以你不應該在乎。我只想指出,像DEP這樣的保護機制有點被高估了。

關於OP問題。
我不認爲在用戶模式下編寫真正的應用程序是一個好主意,特別是在windows中。但爲了教育目的,在彙編中編寫是很好的。編寫具有可寫代碼段的100行長彙編程序沒有任何問題。

+1

但你真的**不應該。有一個可寫的'.text'部分將完全否定ASLR和DEP防止攻擊成功的能力。 – Polynomial

+0

@Polynomial,'ASLR'?請寫什麼是ASLR以及它如何與內存頁面保護標誌相關聯。 「DEP」 - 「防止數據執行」也是如此 - 它與「防止代碼修改」不同,對吧? – Abyx

+0

@Polynomial,你能展示這樣的漏洞嗎? – Abyx

相關問題