Эксплуатация форматной строки, печать переменных из стека - PullRequest
2 голосов
/ 06 октября 2011

Я узнаю об уязвимостях строки формата и написал тестовую программу, чтобы опробовать их.Это моя тестовая программа:

#include <stdio.h>
int main(int argc, char *argv[])
{
    char test[] = "Whatever \n";
printf(argv[1]);
return 0;
}

Если я использую %p в качестве argv[1], она, конечно, выводит адрес из стека.Если я введу %s как argv[1], он напечатает:

__libc_start_main

Я что-то не так делаю с моей программой или аргументами?Как я могу распечатать массив test[] из стека?Это всего лишь пример, я хочу знать, как распечатать любую переменную вообще из стека.Я просто использовал эту программу, поэтому приведу простой пример.

Ответы [ 2 ]

1 голос
/ 06 октября 2011

test [] не будет на вершине стека в printf.Это будет где-то ниже argv [1] и обратного адреса, так что ваш написанный код никогда не будет работать.Если есть способ заставить его работать вообще, вам нужно будет указать для него более одного спецификатора формата для argv [1].Чтобы решить эту проблему, вам нужно ознакомиться с соглашениями о вызовах C, стеком и небольшой сборкой.

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

Некоторые компиляторы могут оптимизировать определение test [], которое больше нигде не встречается в вашей функции. Попробуйте использовать массив в другом месте в main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...