我对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块中包含一个地址(它在同一块中)缓冲液)。
答案 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个字节细分。这是如何计算和我给出近似参考点的位置。