利用艺术 - exploit_notesearch.c

时间:2012-07-15 15:13:58

标签: stack buffer-overflow exploit

我对exploit_notesearch程序有疑问。

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

现在的实际问题: ret-adress在exploit_notesearch程序中通过以下行计算:

ret =(unsigned int)& i-offset;

那么为什么我们可以使用位于exploit_notesearch 程序主堆栈框架底部的 i-variable 的地址来计算转发地址将保存在notesearch程序本身的溢出缓冲区中,所以在一个完全不同的堆栈框架中,并且必须在nop块中包含一个地址(它在同一块中)缓冲液)。

2 个答案:

答案 0 :(得分:1)

  

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

只要系统使用虚拟内存,system()将为易受攻击的程序创建另一个进程,并假设没有堆栈随机化, 考虑到攻击机器在受攻击的机器上编译(即具有易受攻击的notesearch),两个进程在esp函数启动时将具有几乎相同的offset(以及main())值。 。
选择变量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的近似值会更加困难。

答案 1 :(得分:0)

堆栈的分配方式与倒数第一种方法相同。 i变量的位置在顶部的某个位置,并假设它是0x200,并且返回地址位于较低的地址0x180,因此为了确定将放置返回地址的位置,并为此留下一些空间shellcode,攻击者必须得到差异,即:0x200 - 0x180 = 0x80(128),所以他会按如下方式打破它,++,返回地址是4个字节所以,我们在到达之前只剩下48个字节细分。这是如何计算和我给出近似参考点的位置。