首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开发的艺术- exploit_notesearch.c

开发的艺术- exploit_notesearch.c
EN

Stack Overflow用户
提问于 2012-07-15 15:13:58
回答 2查看 1.7K关注 0票数 1

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

该程序仅用于创建一个命令字符串,我们最后使用system()函数调用该命令字符串,以利用包含缓冲区溢出漏洞的notesearch程序。命令看起来如下所示:./notesearch块\shellcode代码重复ret(将跳入nop块).

现在实际的问题是:在exploit_notesearch程序中,由以下行计算ret-入口:

ret =(无符号int) &i-偏移;

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

EN

回答 2

Stack Overflow用户

发布于 2013-08-10 01:04:46

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

只要系统使用虚拟内存,system()就会为易受攻击的程序创建另一个进程,并且假设没有堆栈随机化,那么当它们的main()函数启动时,两个进程的main()函数的值几乎相同(以及offset),因为攻击是在受攻击的机器上编译的(即使用易受攻击的notesearch)。

选择变量i的地址仅仅是为了了解帧基的位置。我们可以用这个代替:

代码语言:javascript
复制
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的近似值就会困难得多。

票数 3
EN

Stack Overflow用户

发布于 2012-11-09 23:57:58

堆栈是以优先于最后一次输出的方式分配的。I变量的位置在顶部的某个位置,让我们假设它是0x200,返回地址位于较低的地址0x180,因此为了确定要放置返回地址的位置,并且还需要为外壳代码留出一些空间,攻击者必须得到差异,即:0x200-0x180= 0x80 (128),因此他将按如下方式分解,++,返回地址是4个字节,所以在到达分段之前我们只剩下48个字节。这就是它的计算方法和位置,我给出了近似的参考点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11493066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档