Читать строку рядом с другой в c

У меня есть этот код:

#include <stdio.h>
#include <strings.h>

int main(int ac, char **av)
{
  char text[] = "PASS_KEY";

  printf("Hey\n");
  return 0;
}

Я знаю, что эти строки буквально следующие один в один в памяти. Как я могу переопределить printf с LD_Preload для чтения text?

1 ответ

Определение прокладки printf сбросить память вокруг указателя это не сложная задача:

#include <stdio.h>

void dump(const char *data) {
    fwrite(data - 32, 1, 64, stdout);
}

int printf(const char *data, ...) {
    dump(data);
}

Компилировать с:

gcc -c -fPIC print.c -o print.o
ld -shared -o libprint.so print.o

и теперь вы можете LD_PRELOAD=./libprint.so ./program и получите ключ. Или вы могли бы... У вас есть несколько отдельных проблем здесь.

GCC как минимум оптимизирует printf без заполнителей в строке формата puts, То, что вызывается вашей программой, не printf, Ну давай шим puts тоже:

int puts(const char *data) {
    dump(data);
}

Теперь вы получаете дамп на экране:

..............Hey........

так что работает. Но ключа нет. Зачем?

Так как text является локальной переменной (массивом) и "Hey\n" постоянная строка Так text размещается в стеке и "Hey\n" в постоянном пуле, который не совсем "рядом с ним". Ваше предположение неверно. Если вы измените программу как:

#include <stdio.h>
#include <strings.h>

int main(int ac, char **av)
{
  char text[] = "PASS_KEY";
  char format[] = "Hey\n";

  printf(format);
  return 0;
}

кстати, это то, что вы ДУМАЕТЕ ДВАЖДЫ, ДО ТОГО, ЧТО ДЕЛАЕТЕ, потому что вы используете строки с непостоянным форматом для printf ПЛОХО в большинстве случаев будет работать:

............Hey
PASS_KEY.

Успех!

Другие вопросы по тегам