1

我有一个关于exploit_notesearch 程序的问题。

该程序仅用于创建我们最终使用 system() 函数调用的命令字符串,以利用包含缓冲区溢出漏洞的 notesearch 程序。commandstr 看起来像这样: ./notesearch Nop-block|shellcode|repeated ret(将在 nop 块中跳转)。

现在是实际问题:在exploit_notesearch 程序中通过以下行计算重新地址:

ret = (unsigned int) &i-offset;

那么为什么我们可以使用在exploit_notesearch程序的主堆栈帧底部的i变量的地址来计算将保存在notesearch程序本身的溢出缓冲区中的ret地址,所以在一个完全不同的 stackframe,并且必须在 nop 块中包含一个地址(在同一个缓冲区中)。

4

2 回答 2

3

这将保存在notesearch程序本身的溢出缓冲区中,因此在完全不同的堆栈帧中

只要系统使用虚拟内存,就会system()为易受攻击的程序创建另一个进程,并且假设没有堆栈随机化,两个进程在函数启动时将具有几乎相同的esp(以及offset)值,假设main()该漏洞利用是在被攻击的机器上编译的(即带有易受攻击的notesearch)。
选择变量的地址i只是为了了解帧基的位置。我们可以改用这个:

unsigned long sp(void)         // This is just a little function
{ __asm__("movl %esp, %eax");} // used to return the stack pointer

int main(){

esp = sp(); 
ret = esp - offset; 

//the rest part of main()

}

因为变量i将位于与 相对恒定的距离上esp,我们可以使用&i代替esp,这并不重要。

ret如果系统不使用虚拟内存,则要获得近似值会困难得多。

于 2013-08-10T01:04:46.417 回答
0

堆栈以先进后出的方式分配。i 变量的位置在顶部的某个位置,假设它是 0x200,而返回地址位于较低的地址 0x180 中,因此为了确定将返回地址放在哪里,并为shellcode,攻击者必须得到差值,即:0x200 - 0x180 = 0x80 (128),所以他将其分解如下,++,返回地址是4个字节,所以我们只剩下48个字节才能到达分割。这就是它的计算方式和我给出的近似参考点的位置。

于 2012-11-09T23:57:58.807 回答