Намеренное переполнение буфера и переход в другую функцию за счёт этого переполнения
#include <stdio.h>
#include <string.h>
void input(char *a)
{
char overflow[4]; // Будем переполнять здесь
gets(overflow); // Небезопасное чтение: не котролирует размер вводимых данных
}
void other() // Переход после переполнения в эту функцию
{
fprintf(stderr, "other\n");
}
int main(int argc, char *argv[])
{
fprintf(stdout,"Введите Вашу строку:\n");
input(argv[1]); // Передаём аргумент в функцию небезопасного чтения
fprintf(stdout, "main\n");
return 0;
}
Есть вот такой код. Необходимо подобрать готовый ввод чтобы после переполнения буфера попасть в функцию other(как раз за счёт переполнения) чтобы она написала строку а потом программа завершилась любым способом. Это необходимо провести с включенным ASLR. Смещение между адресами функций при каждом запуске остается постоянным, но сами адреса изменяются. Скорее всего 4 символа буфера можно заполнить любыми значениями, но как подобрать продолжение, которое как раз приведёт к переходу в other? Взял в таблице ASCII символ равный смещению буфер заполнил 4 буквами A а регистр(где-то видел, что так нужно) 8 буквами A под смещение подходила символ G, но почему-то функция other не отработала. Подскажите, что подправить?
0000000000001189 <input>:
1189: f3 0f 1e fa endbr64
118d: 55 push %rbp
118e: 48 89 e5 mov %rsp,%rbp
1191: 48 83 ec 20 sub $0x20,%rsp
1195: 48 89 7d e8 mov %rdi,-0x18(%rbp)
1199: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
11a0: 00 00
11a2: 48 89 45 f8 mov %rax,-0x8(%rbp)
11a6: 31 c0 xor %eax,%eax
11a8: 48 8d 45 f4 lea -0xc(%rbp),%rax
11ac: 48 89 c7 mov %rax,%rdi
11af: b8 00 00 00 00 mov $0x0,%eax
11b4: e8 c7 fe ff ff call 1080 <gets@plt>
11b9: 90 nop
11ba: 48 8b 45 f8 mov -0x8(%rbp),%rax
11be: 64 48 2b 04 25 28 00 sub %fs:0x28,%rax
11c5: 00 00
11c7: 74 05 je 11ce <input+0x45>
11c9: e8 a2 fe ff ff call 1070 <__stack_chk_fail@plt>
11ce: c9 leave
11cf: c3 ret
00000000000011d0 <other>:
11d0: f3 0f 1e fa endbr64
11d4: 55 push %rbp
11d5: 48 89 e5 mov %rsp,%rbp
11d8: 48 8b 05 61 2e 00 00 mov 0x2e61(%rip),%rax # 4040 <stderr@GLIBC_2.2.5>
11df: 48 89 c1 mov %rax,%rcx
11e2: ba 06 00 00 00 mov $0x6,%edx
11e7: be 01 00 00 00 mov $0x1,%esi
11ec: 48 8d 05 11 0e 00 00 lea 0xe11(%rip),%rax # 2004 <_IO_stdin_used+0x4>
11f3: 48 89 c7 mov %rax,%rdi
11f6: e8 95 fe ff ff call 1090 <fwrite@plt>
11fb: 90 nop
11fc: 5d pop %rbp
11fd: c3 ret
Вот информация из objdump