我正在学习计算机安全课程,并且有一个额外的学分作业是将可执行代码插入到缓冲区溢出中。我有我正在尝试操作的目标程序的 c 源代码,并且我已经达到了可以成功覆盖当前函数堆栈帧的 eip 的程度。但是,我总是遇到分段错误,因为我提供的地址总是错误的。问题是当前函数位于 pthread 内部,因此,堆栈的地址似乎总是在程序的不同运行之间发生变化。是否有任何方法可以查找 pthread 中的堆栈地址(或估计 pthread 中的堆栈地址)? (注意:pthread_create 的第二个参数为 null,因此我们不会手动分配堆栈地址)
我建议阅读关于利用缓冲区溢出漏洞的优秀(如果有点过时)文章/教程为了乐趣和利润而粉碎堆栈 http://insecure.org/stf/smashstack.html.
以下是简短摘录:
问题是我们不知道内存空间在哪里
我们正在尝试利用代码(以及后面的字符串)的程序
它)将被放置。解决这个问题的一种方法是使用 JMP 和 CALL
操作说明。 JMP和CALL指令可以使用IP相对寻址,
这意味着我们可以跳转到当前IP的偏移量,而不需要
知道我们想要跳转到的内存中的确切地址。
您可以通过一些内联汇编来检索堆栈指针的当前值。中的所有示例为了乐趣和利润而粉碎堆栈 http://insecure.org/stf/smashstack.html溢出缓冲区main
,但是您可以轻松地使用相同的技术来溢出从 pthread 调用的函数中的缓冲区。下面的代码基于文章中的示例构建(溢出1.c)以表明相同的技术可以使用 pthreads 来工作。您将使用的实际技术取决于您尝试利用的目标程序。
/* get value of sp off the stack - not essential to example */
unsigned long get_sp()
{
__asm__("movl %esp,%eax"); /* equiv. of 'return esp;' in C */
}
int foo()
{
char buffer[96];
/* overflow buffer to overwrite return address */
/* and place code to be executed into buffer. */
...
return 0;
}
void *thread(void *arg)
{
printf("thread stack 0x%x\n", get_sp());
foo();
return NULL;
}
int main(int argc, char **argv)
{
printf("main stack 0x%x\n", get_sp());
pthread_t t;
pthread_create(&t;, NULL, thread, NULL);
pthread_join(t, NULL);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)