我知道溢出利用需要三个步骤:
1.将任意代码(shellcode)注入目标进程内存空间。
2.控制eip。
3.设置eip以执行任意代码。
我读过关于堆利用的ben hawkens文章,并且理解了关于如何最终覆盖指向我的代码的函数指针的一些策略。
换句话说,我理解第2步。
我不明白第1步和第3步。
如何将代码注入进程内存空间?
在步骤3中,我用a覆盖一个函数指针 指向我的shellcode的指针,如何计算\知道什么地址 注入的代码注入了吗? (这个问题已经解决了 在stackoverflow中使用“jmp esp)。
答案 0 :(得分:3)
在堆溢出中,假设系统没有激活ASLR,您将知道在溢出中使用的内存块(也称为缓冲区)的地址。
一个选项是将shellcode放在缓冲区所在的位置,因为您可以控制缓冲区的内容(作为应用程序用户)。将shellcode字节放入缓冲区后,只需跳转到该缓冲区地址即可。
执行该跳转的一种方法是,例如,覆盖.dtors条目。一旦易受攻击的程序完成,将执行放置在缓冲区中的shellcode。复杂的部分是.dtors覆盖。为此,您将不得不使用已发布的堆利用技术。
先决条件是ASLR被停用(在执行易受攻击的程序之前知道缓冲区的地址),并且放置缓冲区的内存区域必须是可执行的。
更重要的是,第2步和第3步是相同的。如果你控制eip,那么你将它指向shellcode(任意代码)是合乎逻辑的。
P.S。:绕过ASLR更加复杂。
答案 1 :(得分:2)
步骤1需要受攻击代码中的漏洞。 常见的漏洞包括:
第3步需要详细了解目标架构。
答案 2 :(得分:1)
如何将代码注入流程空间?
这是一个非常明确的陈述/问题。它需要一个可利用的'所述处理空间中的代码区域。例如,如果可能的话,Windows当前正在将strcpy()重写为strncpy()。我说 如果可能的话
因为并非所有使用strcpy的代码区域都可以成功转换为strncpy。为什么?因为下面显示的这个关键所在的@ @;
strcpy($buffer, $copied);
或
strncpy($buffer, $copied, sizeof($copied));
这使得strncpy
在现实世界的场景中难以实现。必须安装一个神奇的号码'大多数strncpy
操作(sizeof()运算符创建此幻数)
作为编码员'我们被教导使用硬编码值,例如严格遵守char buffer[1024];
是非常糟糕的编码实践。
但相比之下 - 使用buffer[]="";
或buffer[1024]="";
是攻击的核心。但是,如果我们将此代码更改为后者,我们会在系统中引入另一个漏洞...
char * buffer;
char * copied;
strcpy(buffer, copied);//overflow this right here...
或者这个:
int size = 1024;
char buffer[size];
char copied[size];
strncpy(buffer,copied, size);
这将停止溢出,但由于大小可预测并构造成1024块代码/数据,因此在RAM中引入了可利用的区域。
因此,在程序的地址空间中寻找strcpy的原始海报,如果存在strcpy,将使程序可利用。
程序员优先于strncpy
支持strcpy的原因有很多。幻数,可变输入/输出数据大小......编程风格......等等......
如何在我的代码(我的位置)找到自己
检查各种黑客书籍的例子〜
但是,试试;
label:
pop eax
pop eax
call pointer
jmp label
pointer:
mov esp, eax
jmp $
这是一个不起作用的例子,因为我不想对编写下一个Morris蠕虫负责!但是,任何体面的程序员都会得到这段代码的主旨,并立即知道我在这里谈论的是什么。
我希望你的溢出技术将来有用,我的儿子!