C Переполнение буфера Отображаемое сообщение (с использованием Ubuntu и DDD) - PullRequest
0 голосов
/ 08 декабря 2011
#include <stdio.h>
#include <stdlib.h>
void badf(int n, char c, char* buffer)
{
    int i;
    for (i=0; i<n; i++)
    {
    buffer[i]=c;
    }

}

void f(int n, char c)
{
    char buffer[16];
    badf(n,c,buffer);
}

void message ()
{
printf("Hello\n");

}

int main()
{
f(32,0x08048411);
    return 0;
}

Это код, который я получил до сих пор (получил его основу и должен придерживаться его, поэтому есть функция badf и f)

Цель состоит в том, чтобы программа печатала сообщение Hello, переполняя указатель инструкции. Используя отладчик отображения данных в Ubuntu, я считаю, что адрес этого дисплея 0x0804811.

Когда я запускаю программу и использую x / 16x $ esp, следующий адрес в стеке составляет всего 1 с (я предполагаю, что только две последние цифры берутся из адреса выше)

Интересно, как сделать следующий адрес полным адресом, а не только двумя последними цифрами?

Также 32 вычисляется из 16 (определенный выше буфер) + 8 (базовый указатель) + 8 (указатель инструкций)

Заранее спасибо за любую помощь, поскольку я знаю эту конкретную проблему.

1 Ответ

0 голосов
/ 08 декабря 2011

Не передавайте адрес через 8-битное целое число (char), но используйте достаточно широкий тип ... - это не менее 32 бит.

Изменить следующим образом:

void badf(int n, unsigned int u, char* buffer)
...

void f(int n, unsigned int u)
...
...