Читать строку рядом с другой в 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.
Успех!