Адрес локальной переменной C ++ находится перед адресом, возвращаемым локальными объектами информационного фрейма gdb - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующий исходный код (в файле с именем vuln. cpp) в C:

#include <stdio.h>
#include <string.h>

int main(int argc, char ** argv)
{
    char real[20];
    char pass[20] = "dddddddddddddddd";

    if(argc < 2)
    {
        printf("Usage:\t%s\tpassword\n", argv[0]);
        return -1;
    }

    memcpy(real, argv[1], strlen(argv[1]) + 1);

    if(strncmp(real, pass, 20) == 0)
    {
        printf("SUCCESS!\n");
    }
    else
    {
        printf("FAILURE!\n");
    }

    printf("real:\t%s\npass:\t%s", real, pass);
    return 0;
}

Я скомпилировал исходный код, используя gcc -g -O0 vuln.cpp. Обратите внимание, что моя машина, а также ОС (Ubuntu 18.04) имеют архитектуру x86_64

Я запустил gdb a.out, затем b 16, затем run $(python -c 'print("a"*10)')

Теперь с кодом, запущенным в строке 16 , сразу после memcpy я делаю info frame. Это выводит

(gdb) info frame
Stack level 0, frame at 0x7fffffffd9d0:
 rip = 0x555555554887 in main (vuln.cpp:17); saved rip = 0x7ffff7a05b97
 source language c++.
 Arglist at 0x7fffffffd9c0, args: argc=2, argv=0x7fffffffdaa8
 Locals at 0x7fffffffd9c0, Previous frame's sp is 0x7fffffffd9d0
 Saved registers:
  rbp at 0x7fffffffd9c0, rip at 0x7fffffffd9c8

Теперь я сделал p &real

$3 = (char (*)[20]) 0x7fffffffd980

Как может адрес локальной переменной real[0] быть перед адресом локальных жителей, перечисленных в информационном фрейме?

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