利用的艺术 -exploit_notesearch.c

问题描述 投票:0回答:3

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

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

现在真正的问题是: ret-地址是在exploit_notesearch程序中通过以下行计算的:

ret = (无符号整数) &i-偏移量;

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

stack buffer-overflow exploit
3个回答
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
的近似值会困难得多。


0
投票

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


0
投票

因为我们减去,UP。不要忘记,堆栈是向后的……没关系。我们减去以进入更新的程序。堆栈中的内存越低,程序越旧......

© www.soinside.com 2019 - 2024. All rights reserved.