с этим 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
, кто-нибудь знает почему?