Как этот код может повредить мою трассировку стека? - PullRequest
0 голосов
/ 21 июня 2019

Эта простая тестовая программа,

$ cat crash.c 
int main() {
    int x = 0;
    *(&x + 5) = 10;
    return 0;
}

Скомпилирована с GCC 7.4.0,

$ gcc -O0 -g crash.c

Имеет неожиданную трассировку стека

$ ./a.out 
Segmentation fault (core dumped)
$ gdb ./a.out /tmp/wk_cores/core-pid_19675.dump
Reading symbols from ./a.out...done.
[New LWP 19675]
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007f450000000a in ?? ()
(gdb) bt
#0  0x00007f450000000a in ?? ()
#1  0x0000000000000001 in ?? ()
#2  0x00007fffd6f97598 in ?? ()
#3  0x0000000100008000 in ?? ()
#4  0x00005632be83d66a in frame_dummy ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Не знаюне понимаю, почему стек не показывает недопустимое хранилище в привилегированную память?Может кто-нибудь помочь мне понять это?

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

x - последняя переменная в вашем стеке.Поэтому, если вы пишете в x + 5, независимо от того, как далеко вы идете , вы всегда пишете в стековой памяти после области текущего выделенного стека.Поэтому это всегда терпит неудачу.

0 голосов
/ 21 июня 2019

Я не понимаю, почему в стеке не отображается неверное хранилище для привилегированной памяти?

Поскольку вы не ничего не сохранили в привилегированной памяти.

Для этого вам нужно написать way вне стека, что-то вроде:

*(&x + 0x10000) = 5;

Как есть, ваша программа имеет неопределенное поведение, но она не записывает в «привилегированную» память, просто в память, которая доступна для записи, но в которую вы не должны писать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...