Как сделать исполняемый стек для образования стека? - PullRequest
0 голосов
/ 30 января 2020

с этим c:

#include <stdio.h>
#include <stdlib.h>

void return_input(void){
    char ar[30];
    scanf(" %s", ar);
    printf("%s\n",ar);
}

int main (void) {

    return_input();
    return 0;
}

как дизассемблировано:

 0x0804919b <+0>:   push   %ebp
   0x0804919c <+1>: mov    %esp,%ebp
   0x0804919e <+3>: and    $0xfffffff8,%esp
   0x080491a1 <+6>: call   0x8049172 <return_input>
   0x080491a6 <+11>:    mov    $0x0,%eax
   0x080491ab <+16>:    leave  
   0x080491ac <+17>:    ret    

Я хочу запустить адрес 0x080491a1, чтобы напечатать вывод 2 раза (просто чтобы увидеть можно выполнить произвольный адрес):

$ printf "AAAAAAAAAABBBBBBBBBBCCCCCCCCCC\xa1\x91\x04\x08" | ./exe

, но вместо выполнения (в книге, в которой я прочитал Руководство по шеллкодеру , он будет введен 2 раза, так что я ожидаю) , это возникает: AAAAAAAAAABBBBBBBBBBCCCCCCCCCC�� Segmentation fault (core dumped)

скомпилировано с cc -mpreferred-stack-boundary=3 -ggdb -m32 -fno-stack-protector -o exe -no-pie -fno-PIE exe.c

Как получить доступ к адресу памяти без segfault?

РЕДАКТИРОВАТЬ: добавлено -z execstack, но все же segfault, кто-нибудь знает почему?

1 Ответ

2 голосов
/ 30 января 2020

То, что вы ищете, это опция -z execstack G CC. Его использование сделает стек вашей программы исполняемым. Вы также можете использовать утилиту командной строки execstack для изменения существующих двоичных файлов, делая их стек исполняемым (или не исполняемым).

...