【问题标题】:can i implement counter in the .text area without using registers?我可以在.text 区域中实现计数器而不使用寄存器吗?
【发布时间】:2011-12-09 11:28:38
【问题描述】:

我在 .text 段中有这个汇编代码,是否有可能我不能在 .text 区域中包含一个 dword。如果我将一些 dword 放在 .data 部分中,它可以正常工作,我的意思是当我换行时:

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

【问题讨论】:

    标签: windows assembly


    【解决方案1】:

    .text 段是只读段。对于可修改的变量,您应该使用 .bss .datastack

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

    【讨论】:

    • win32中没有“.text段”。有CS寄存器选择的代码段,也可以有.text段不可写,如果编译(链接)不可写。
    • 大多数编译器都将入口点部分称为.text,以至于它现在被认为是一个替代术语。
    【解决方案2】:

    .text 区域通常是只读的,因此您不能将结果写入其中。你可以改用.data,如果你真的想要,甚至可以使用堆栈。

    【讨论】:

    • 当然,但是您不应该拥有.text 可写,正如我在您的回答中提到的那样。安全问题数不胜数。
    【解决方案3】:

    您可以使用VirtualProtect 函数使.text section 可写。


    更新:关于安全风险:
    正如@RaymondChen 所写,拥有读写执行页面是不安全的。

    攻击者可以利用缓冲区溢出的方式覆盖指向另一个缓冲区的指针,并将攻击者的代码复制到读写执行(RWX)页面。

    但是,当您使用软件保护工具保护您的程序,或者只是使用 UPX 打包它时,代码部分变得可写。并且某些流行的商业保护器不会使其不可写回。如果你的字典有一个加载到每个进程中的 DLL 并且它有 RWX 部分,那就很有趣了。

    我不想说如果有很多“受保护”的程序不关心 RWX 内存,那么你也不应该关心。我只想指出,像 DEP 这样的保护机制有点被高估了。

    关于 OP 问题。
    我认为在用户模式下在汇编中编写真正的应用程序并不是一个好主意,尤其是在 Windows 中。但是为了教育目的而编写汇编是可以的。编写带有可写代码段的 100 行汇编程序也没有错。

    【讨论】:

    • 但你真的不应该。拥有一个可写的 .text 部分将完全否定 ASLR 和 DEP 阻止漏洞成功的能力。
    • @多项式,ASLR?请写出什么是 ASLR 以及它与内存页面保护标志的关系。 DEP也一样——“数据执行预防”——和“代码修改预防”不一样吧?
    • DEP 使攻击者更难,因为这意味着默认情况下系统中没有读写执行页面。如果您启用您的代码段的写入功能,那么您在系统中创建了一个读写执行页面:您所做的正是 DEP 试图阻止的事情!您创建的代码(可执行内存)也是数据(可写内存)。大多数人担心防止数据变成代码,但你所做的是让代码变成数据。 (还要注意,使代码可写也可以防止进程之间的代码共享,因为现在每个进程都有不同的代码副本。)
    • 雷蒙德是绝对正确的。任何堆溢出、堆栈缓冲区溢出、SEH 指针利用或其他任意漏洞都将允许攻击者编写有效负载并在进程内存中的任何位置执行它,甚至在 .text
    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 2014-04-08
    • 2019-04-07
    • 1970-01-01
    • 2015-08-27
    • 2019-09-01
    • 2013-08-30
    • 2018-06-25
    相关资源
    最近更新 更多