Используемый компилятор: GCC 3.4.4 ОС: Windows XP 32bit
В более старых компиляторах C/C++ (например, gcc 3.4 или Visual Studio 6) можно манипулировать кадром стека для управления выполнением программы (например, через поврежденные адреса возврата) с переполнением буфера.
Попытка показать это не удалась из-за того, что все данные, которые мне нужно было скопировать, включали байт нулей, на котором копирование всегда останавливалось.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int checkauth(char *password)
{
int authflag = 0;
char passwordbuffer[10] = "aaaaaaa";
strcpy(passwordbuffer, password);
if(strcmp(passwordbuffer, "password")==0)
authflag = 1;
return authflag;
}
int main (int argc, char *argv[])
{
int authflag = 0;
char password[10] = "bbbbb";
if (argc < 2)
{
printf("Password missing");
exit(0);
}
authflag = checkauth(argv[1]);
if(authflag > 0)
printf(" password ok \r\n");
else
printf("wrong password, %s \r\n", argv[1]);
return 0;
}
Как показывает код, я использую аргумент командной строки для заполнения буфера. Это всегда останавливается на первом пробеле. Я искал несколько примеров (книга: Взлом — искусство эксплойта, stackoverflow…), но все работают с адресами, которые не содержат ни байта нулей. Проблема в этом случае зависит от сохраненного указателя стека (адрес включает в себя байты нулей), лежащего в памяти перед адресом возврата, и программа всегда завершается ошибкой, если указатель стека не имеет какого-либо допустимого значения.
Адрес, на который я хотел бы перейти, будет 0x004013BA вместо 0x004013b1. Сохраненный указатель стека получил значение 0x0022ff78. Это означает, что мне нужно заполнить буфер 43 байтами чего-то случайного, а также указателем стека и адресом возврата.
Как решить эту проблему?
Спасибо