Попытка разбить стек
Я пытаюсь воспроизвести результаты переполнения стека, которые я прочитал из статьи Алефа Уэна «разбить стек ради удовольствия и прибыли» (можно найти здесь: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 <+0>: push %rbp
0x00000000004005b1 <+1>: mov %rsp,%rbp
0x00000000004005b4 <+4>: sub $0x10,%rsp
0x00000000004005b8 <+8>: movl $0x0,-0x4(%rbp)
0x00000000004005bf <+15>: mov $0x3,%edx
0x00000000004005c4 <+20>: mov $0x2,%esi
0x00000000004005c9 <+25>: mov $0x1,%edi
0x00000000004005ce <+30>: callq 0x400564 <function>
0x00000000004005d3 <+35>: movl $0x1,-0x4(%rbp)
0x00000000004005da <+42>: mov -0x4(%rbp),%eax
0x00000000004005dd <+45>: mov %eax,%esi
0x00000000004005df <+47>: mov $0x4006dc,%edi
0x00000000004005e4 <+52>: mov $0x0,%eax
0x00000000004005e9 <+57>: callq 0x400450 <printf@plt>
0x00000000004005ee <+62>: leaveq
0x00000000004005ef <+63>: retq
End of assembler dump.
Я жестко закодировал обратный адрес, чтобы пропустить x = 1; В строке кода я использовал жестко закодированное значение из дизассемблера (адрес: 0x4005da). Целью этого эксплойта является печать 0, но вместо этого это печать 1.
У меня очень сильное чувство, что "ret = buffer1 + 12;" не является адресом обратного адреса. Если это так, то как я могу определить адрес возврата, gcc выделяет больше памяти между адресом возврата и буфером.