Перенаправление указателя инструкций через переполнение стека - PullRequest
2 голосов
/ 22 октября 2011

Я читал Руководство шеллкодера (2e) и пытался воспроизвести эксперимент по переполнению стека на страницах 18-23.

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

void return_input (void)
{
    char array[30];
    gets (array);
    printf(“%s\n”, array);
}
main()
{
    return_input();
    return 0;
}

Компиляция: gcc -fno-stack-protector -o overflow overflow.c

Дамп кода ассемблера для функции main:

0x080483ea <main+0>:  push %ebp
0x080483eb <main+1>:  mov  %esp,%ebp
0x080483ed <main+3>:  call 0x80483c4 <return_input>
0x080483f2 <main+8>:  mov  $0x0,%eax
0x080483f7 <main+13>: pop  %ebp
0x080483f8 <main+14>: ret

Мы можем перезаписать сохраненный обратный адрес адресом вызова на return_input()

$ printf
"AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDD\xed\x83\x04\x08" | ./overflow
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDí
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDò

Так что это приводит к тому, что наш ввод будет напечатан дважды. Тем не менее, мне не предложили ввести во второй раз. Разве второй вызов return_input() не должен привести к повторному вызову gets()?

1 Ответ

0 голосов
/ 22 октября 2011

Это, вероятно, связано с тем, что get () читает со стандартного ввода.

Слегка измененная версия вашей программы:

#include <stdio.h>

int n = 1;

void return_input(void)
{
    char array[30];
    gets (array);
    printf("%s\n", array);
    if (n--) return_input();
}

int main(void)
{
    return_input();
    return 0;
}

Если я просто запустил его, я могу набрать 2 короткие строки (за каждой следует клавиша Enter), например:

C:\gets.exe
qwe
qwe
123
123

И здесь qwe и 123 повторяются на экране (первый раз, когда я их печатаю, второй, когда они печатаются).

Когда я передаю программы ввода в Windows с помощью команды echo, я получаю следующее без возможности ввода второй строки, get () каким-то образом удается получить мусор в качестве ввода при вызове во второй раз:

C:\echo qwe|gets.exe
qwe
№  ☺

Итак, что-то не так в том, как gets () читает ввод по каналу, и это не имеет никакого отношения к переполнению стека.

...