Попытка разбить стек
Я пытаюсь воспроизвести результаты стекового потока, которые я прочитал из Aleph One 'статьяразбивая стек для удовольствия и прибыли "(можно найти здесь:http://insecure.org/stf/smashstack.html).
Попытка перезаписать обратный адрес неКажется, это работает для меня.
Код C:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
//Trying to overwrite return address
ret = buffer1 + 12;
(*ret) = 0x4005da;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
разобрали главное:
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004005b0 : push %rbp
0x00000000004005b1 : mov %rsp,%rbp
0x00000000004005b4 : sub $0x10,%rsp
0x00000000004005b8 : movl $0x0,-0x4(%rbp)
0x00000000004005bf : mov $0x3,%edx
0x00000000004005c4 : mov $0x2,%esi
0x00000000004005c9 : mov $0x1,%edi
0x00000000004005ce : callq 0x400564
0x00000000004005d3 : movl $0x1,-0x4(%rbp)
0x00000000004005da : mov -0x4(%rbp),%eax
0x00000000004005dd : mov %eax,%esi
0x00000000004005df : mov $0x4006dc,%edi
0x00000000004005e4 : mov $0x0,%eax
0x00000000004005e9 : callq 0x400450
0x00000000004005ee : leaveq
0x00000000004005ef : retq
End of assembler dump.
Я жестко закодировал обратный адрес, чтобы пропустить x = 1; В строке кода я использовал жестко закодированное значение из дизассемблера (адрес: 0x4005da). Целью этого эксплойта является печать 0, но вместо этого это печать 1.
У меня очень сильное чувство, что "ret = buffer1 + 12; " не является адресом обратного адреса. Если это так, то как я могу определить адрес возврата, gcc выделяет больше памяти между адресом возврата и буфером.