Почему мой буфер хранится в двух местах в стеке? - PullRequest
0 голосов
/ 26 мая 2019

Код:

#include <stdio.h>

    int main(int argc, char *argv[]){
    char buf[512];
    strcpy(buf, argv[1]);
    return 0;
}

Компиляция:

gcc -g -z execstack buf.c -o buf -fno-stack-protector

Вопрос:

Итак, в основном, используя gdb, я устанавливаю точку останова в строке return 0; и запускаю скрипт следующим образом: run $(python -c 'print "A"*600'), а затем, когда я выполняю x/600x $rsp, я получаю начало буфера в:

0x7fffffffdcf0: 0xffffdfe8      0x00007fff      0xf7fd3298      0x00000002
0x7fffffffdd00: 0x41414141      0x41414141      0x41414141      0x41414141
0x7fffffffdd10: 0x41414141      0x41414141      0x41414141      0x41414141

// it goes on... until
0x7fffffffdf50: 0x41414141      0x41414141      0x00000000      0x00000000

Но потом, когда я иду дальше вниз по стеку, я также вижу:

0x7fffffffe2f0: 0x776f6c66      0x6675622f      0x41414100      0x41414141
0x7fffffffe300: 0x41414141      0x41414141      0x41414141      0x41414141

// It goes until
0x7fffffffe540: 0x41414141      0x41414141      0x41414141      0x41414141
0x7fffffffe550: 0x48530041      0x3d4c4c45      0x6e69622f      0x7361622f

Также для эксплойта с переполнением буфера. Если я использую первое местоположение, мой эксплойт не работает, но если я использую второе местоположение, оно работает.

Итак, могу ли я знать, почему мой буфер хранится в двух разных местах?

1 Ответ

1 голос
/ 26 мая 2019

Ваш буфер не хранится в двух местах.Вы просто копируете данные сами в своем коде.Есть входные данные для main, а затем ваш буфер, куда вы копируете входные данные.Это две его копии, но только один - ваш буфер.

Использование gdb, чтобы показать, где хранится argv[1], также покажет это:

p argv[1]
$1 = 0x7ffffffee2ce 'A' <repeats 600 times>

Адрес, конечно, будет другимразные системы.

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