Я пытаюсь изменить rip для перенаправления потока кода в функцию с именем 'win'. Однако многие попытки потерпели неудачу.
Вот код, разборка и системные характеристики:
void return_input (void)
{
char array[30];
gets (array);
printf("%s\n", array);
}
void win (void)
{
printf("Redirected!\n");
}
int main() {
return_input();
return 0;
}
Compiled using: cc -ggdb overflow.c -o Overflow
Dump of assembler code for function main:
0x0000555555555180 <+0>: push %rbp
0x0000555555555181 <+1>: mov %rsp,%rbp
0x0000555555555184 <+4>: callq 0x555555555145 <return_input>
0x0000555555555189 <+9>: mov $0x0,%eax
0x000055555555518e <+14>: pop %rbp
0x000055555555518f <+15>: retq
location of win: 0x55555555516d <win>: -443987883
System specs (I am using a kali vm):
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 39 bits physical, 48 bits virtual
Vendor ID: GenuineIntel
CPU family: 6
Model: 70
Model name: Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz
С p / d 0x7fffffffe148-0x7fffffffe120 в GDB я обнаружил, что требуемый отступ равен 40.
Итак, я придумал это: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6d\x51\x55\x55\x55\x55\x00\x00
Затем printf 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6d\x51\x55\x55\x55\x55\x00\x00' | ./Overflow
printf 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6d\x51\x55\x55\x55\x55\x00\x00' |
./TheOver AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQUUUU
Segmentation fault
Я также попытался echo 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6d\x51\x55\x55\x55\x55\x00\x00' | ./TheOver
И не сработало, поэтому я подумал, что это не проблема ...
Редактировать: До и после стека и информационного фрейма: