我有一个关于exploit_notesearch程序的问题。
该程序仅用于创建一个命令字符串,我们最后使用system()函数调用该命令字符串,以利用包含缓冲区溢出漏洞的notesearch程序。命令看起来如下所示:./notesearch块\shellcode代码重复ret(将跳入nop块).。
现在实际的问题是:在exploit_notesearch程序中,由以下行计算ret-入口:
ret =(无符号int) &i-偏移;
那么,为什么我们可以使用i-变量的地址,该地址位于exploit_notesearch程序的主堆栈帧的底部,以计算将保存在notesearch程序本身的溢出缓冲区中的ret ,因此位于完全不同的堆栈帧中,并且必须在nop块中包含一个地址(该地址位于相同的缓冲区中)。
发布于 2013-08-10 01:04:46
它将保存在notesearch程序本身的溢出缓冲区中,因此保存在一个完全不同的堆栈框架中。
只要系统使用虚拟内存,system()就会为易受攻击的程序创建另一个进程,并且假设没有堆栈随机化,那么当它们的main()函数启动时,两个进程的main()函数的值几乎相同(以及offset),因为攻击是在受攻击的机器上编译的(即使用易受攻击的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的近似值就会困难得多。
发布于 2012-11-09 23:57:58
堆栈是以优先于最后一次输出的方式分配的。I变量的位置在顶部的某个位置,让我们假设它是0x200,返回地址位于较低的地址0x180,因此为了确定要放置返回地址的位置,并且还需要为外壳代码留出一些空间,攻击者必须得到差异,即:0x200-0x180= 0x80 (128),因此他将按如下方式分解,++,返回地址是4个字节,所以在到达分段之前我们只剩下48个字节。这就是它的计算方法和位置,我给出了近似的参考点。
https://stackoverflow.com/questions/11493066
复制相似问题