Я пытаюсь переопределить запись GOT, чтобы при вызове printf
вместо system
(callme
ниже).
// gcc source.c -no-pie -fno-pic -fno-stack-protector -g
#include <stdio.h>
#include <stdlib.h>
void callme(char *p) {
system(p);
}
int main(int argc, char **argv)
{
char *pointer = NULL;
char array[10];
pointer = array;
fgets(pointer, 18, stdin);
printf("p contains %s at %p\n", pointer, &pointer);
fgets(pointer, 8, stdin);
printf("p contains %s at %p\n", pointer, &pointer);
return EXIT_SUCCESS;
}
Моя идея написать 10 случайных символов и адрес printf @ plt в первом fgets
, адрес callme
во втором.
gef➤ p &pointer
$1 = (char **) 0x7fffffffdea8
gef➤ p &array
$2 = (char (*)[10]) 0x7fffffffde9e
gef➤ p (0x7fffffffde9e+10)
$3 = 0x7fffffffdea8
Чтобы попробовать это, я просто собираюсь переопределить полученное с помощью некоторых А.
gef➤ r < <(printf "%010d\x20\x10\x60\x00\x00\x00\x00\x00" 0) <(perl -e "print 'A'x8")
где 0x061020 - адрес местоположения в полученном.
Перед вторым fgets
,
gef➤ x/g pointer
0x601020: 0x7ffff7a48e80
gef➤ x/i 0x7ffff7a48e80
0x7ffff7a48e80 <__printf>: sub rsp,0xd8
что нормально, тогда *pointer
не меняет значение, и я не пишу полученному. Я ожидаю, что "A" * 8 в get и следующий вызов printf
к SIGSEGV, но он работает нормально.