Разборка кода на C и проверка стека - PullRequest
0 голосов
/ 18 апреля 2019

Итак, у меня есть простой код на C, который создает буфер размером 512 байт:

 #include <sys/types.h>
 #include <netinet/in.h>

 #include <stdio.h>
 #include <ctype.h>

 main(argc, argv)
      char *argv[];
 {
    char line[512];
    gets(line);
 }

Означает ли это, что для стека для этого буфера выделено ровно 512 байт?Есть ли способ в GDB, мы можем разобрать скомпилированный двоичный файл, мы можем видеть такие вещи, как

  • расстояние между стеком и адресом возврата
  • какой параметр передается в 'gets ()функция .. такая как адрес?

Я попытался пройти через это с помощью GDB, но не смог найти способы проверить подобные вещи

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Вы можете проверить инструмент командной строки 'strace'.В нем будут перечислены все внутренние системные вызовы и соответствующие аргументы.Это также даст вам представление о том, сколько памяти выделяется.

Обратите внимание, что вы должны использовать get с осторожностью, так как он не проверяет переполнение буфера.

На странице man:

gets () считывает строку из stdin в буфер, на который указывает s, до завершающей строки или EOF, которую он заменяет на \ 0.Проверка переполнения буфера не выполняется (см. Ниже ошибки).

0 голосов
/ 18 апреля 2019

Вы можете использовать printf для отображения адресов памяти, если хотите, например, так:

#include <stdio.h>
int main() {
  char line1[512];
  char line2[512];
  char line3[512];
  printf("line1 ptr: %p\n", line1);
  printf("line2 ptr: %p\n", line2);
  printf("line3 ptr: %p\n", line3);
  long int diff = line3 - line1;
  printf("diff between line3 and line1 : %ld\n", diff);
  return 0;
}

Если вы запустите это, вы, вероятно, увидите, что ячейки памяти в line1, line2 и line1 имеютточно 512 байт между ними, если компилятор решил разместить его в памяти таким образом.

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