У меня есть следующий исходный код (в файле с именем 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]
быть перед адресом локальных жителей, перечисленных в информационном фрейме?