Я столкнулся с этим кодом, показывающим использование строки строки при чтении этой статьи.
#include <stdio.h>
int main(void)
{
char secret[]="hack.se is lame";
char buffer[512];
char target[512];
printf("secret = %pn",&secret);
fgets(buffer,512,stdin);
snprintf(target,512,buffer);
printf("%s",target);
}
Выполнение его с помощью следующего ввода
[[email protected]]$ ./a.out
secret = 0xbffffc68
AAAA%x %x %x %x %x %x %x //Input given
AAAA4013fe20 0 0 0 41414141 33313034 30326566
- [[email protected]]$
Я до сих пор понимаю, что последовательность %x
будет продолжать печатать значения по адресам выше текущего %esp
(я предполагаю, что стек растет вниз к нижнему адресу).
То, что я не могу понять, - это введенный ввод сохраняется в массиве buffer
, который не может быть меньше 512 байт от текущего %esp
. Итак, как вывод может содержать 41414141
(шестнадцатеричное представление AAAA
) сразу после 4 %x
, то есть чуть выше 4 адресов текущего %esp
. Я тоже старался уставиться на код сборки, но я думаю, что не мог следить за манипуляциями с строками в стеке.