2011-12-09 19 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

相关问题