Я хотел использовать этот код, используя уязвимость строки формата:
int jackpot;
void fmt_str(void)
{
char buf[128];
puts("Give me a string to print");
read(0, buf, 128);
printf(buf);
printf("jackpot @ %p = %d [0x%08x]\n", &jackpot, jackpot, jackpot);
if (jackpot == 0x1337)
puts("You won!");
else
puts("You lost :(");
}
int main(void)
{
srand(time(0));
setbuf(stdout, 0);
jackpot = rand();
fmt_str();
return 0;
}
Идея состоит в том, чтобы использовать уязвимость строки формата, чтобы получить «Вы выиграли!».Используя objdump
, я обнаружил, что адрес глобальной переменной jackpot
равен 0x0804a04c
.Поскольку я не могу использовать скрипт Python для ввода своей строки в argc, я попытался сделать это (работая над gdb):
Give me a string to print
AAAAAAAAAAAAAAAA '\x4c\xa0\x04\x08' BBBBBBBBBBBBBBB %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
, и это то, что я получил с print(buf)
AAAAAAAAAAAAAAAA '\x4c\xa0\x04\x08' BBBBBBBBBBBBBBB bffff280 80 0
41414141 41414141 41414141 41414141 785c2720 785c6334 785c3061
785c3430 20273830 42424242 42424242 42424242 20424242 25207825
78252078 20782520 25207825 78252078 20782520 25207825 78252078
20782520
По сути, я намерен иметь адрес jackpot
между 41 и 42, чтобы я мог лучше найти его в напечатанной строке и выполнить атаку, изменив %x
на %n
.Проблема в том, что при таком способе чтения ввода я не могу записать целевой адрес в строке, поэтому я не могу выполнить атаку.Что ты предлагаешь?Программа компилируется с помощью исполняемого стека, с -fno-stack-protection и с отключенным ASLR.