对于缓冲区溢出,使用 pthread 时堆栈地址是多少?

2024-01-01

我正在学习计算机安全课程,并且有一个额外的学分作业是将可执行代码插入到缓冲区溢出中。我有我正在尝试操作的目标程序的 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(使用前将#替换为@)

对于缓冲区溢出,使用 pthread 时堆栈地址是多少? 的相关文章

随机推荐