Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

22.09.2009, 18:56
|
|
Участник форума
Регистрация: 27.10.2008
Сообщений: 215
Провел на форуме: 810079
Репутация:
90
|
|
Переполнение буфера
Решил попрактиковаться в переполнении буфера. Накатал быстренько уязвимую программу. При передаче такого аргумента `perl -e 'print "A"x100'` в отладчике gdb выдаёт:
Starting program: /home/inflame/prog `perl -e 'print "A"x100'`
Program received signal SIGSEGV, Segmentation fault.
0x08048407 in main()
Вывод команды i r:
eax 0x0 0
ecx 0x41414141 1073745396
edx 0x0 0
ebx 0x4016e800 1075243008
esp 0x4141413d 0x4141413d
ebp 0x41414141 0x41414141
esi 0x40016640 1073833536
edi 0x8048510 134513936
eip 0x8048407 0x8048407 <main+99>
...
Тогда как, на сколько я понимаю, регистр eip должен быть перезаписан на 0x41414141. Но такого не происходит и передать управление на шелл-код не удаётся.
В чём проблема?
Уязвимая программа:
Код:
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[])
{
char buf[10];
if (argc > 1)
strcpy(buf, argv[1]);
return 0;
}
Дистрибутив Mandriva 2009.1
Компилятор gcc 4.3.2
Последний раз редактировалось InFlame; 23.09.2009 в 08:28..
|
|
|

22.09.2009, 22:34
|
|
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме: 193434
Репутация:
79
|
|
1. 0x8048407 <- что за адрес? включается ли он в образ проги в памяти
2. В студии (я как бэ виндовс секурити изучаю) по умолчанию включена проверка на переполненные буферы и по умолчанию будет отслеженна такая ситуация и прога будет по тихому прибита. Есть ли в gcc такая шняга я не знаю ...
3. В таких ситуациях надо вручную смотреть как происходит переполнение в отладчике иначе трудно чтолибо говорить.
|
|
|

23.09.2009, 22:23
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
>>. В студии (я как бэ виндовс секурити изучаю) по умолчанию включена проверка на переполненные буферы
ничего там не включено.только отвратительые ворнинги со словами юзайте _s или пишите CRT_SECURE_NO_DEPRECATE
2 ТС
запусти отладчик?
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

24.09.2009, 01:03
|
|
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме: 193434
Репутация:
79
|
|
2desTiny
я не про depricated говорил вообщето
Код:
/GS [-]
Обнаружение некоторых возможных переполнений буфера, при которых перезаписывается возвращаемый адрес.
MSDN!
Оно работает таки )
PHP код:
sub_401000 proc near ; CODE XREF: sub_401030+Ap
.text:00401000
.text:00401000 var_10 = byte ptr -10h
.text:00401000 var_4 = dword ptr -4 <- помещаем переменную между буфером и адресом возврата, etc
.text:00401000 arg_0 = dword ptr 8
.text:00401000
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 10h
.text:00401006 mov eax, dword_40A000
.text:0040100B xor eax, ebp <- для каждой функции свое персональное значение
.text:0040100D mov [ebp+var_4], eax <- сохраняем значение в качестве метки
.text:00401010 mov eax, [ebp+arg_0]
.text:00401013 push eax ; char *
.text:00401014 lea ecx, [ebp+var_10]
.text:00401017 push ecx ; char *
.text:00401018 call _strcpy
.text:0040101D add esp, 8
.text:00401020 mov ecx, [ebp+var_4]
.text:00401023 xor ecx, ebp <- в случае если буфер переполнится, локальная переменная затрется
.text:00401025 call sub_401148 <- что и проверяется здесь, если она не соответствует постоянному значению процесс тихо прибъется.
.text:0040102A mov esp, ebp
.text:0040102C pop ebp
.text:0040102D retn
.text:0040102D sub_401000 endp
Последний раз редактировалось Hiro Protagonist; 24.09.2009 в 01:14..
|
|
|

24.09.2009, 13:57
|
|
Участник форума
Регистрация: 27.10.2008
Сообщений: 215
Провел на форуме: 810079
Репутация:
90
|
|
2desTiny
я ведь выложил листинг с gdb. Ведь поидее после передачи 200 символов в 10-символьный буфер адрес возврата стопроцентно должен перезаписаться. А у меня вместо 0x41414141 в eip 0x8048407.
А, кстати, может ли это быть защита со стороны ОС или компилятора? Никакие патчи не ставил.
|
|
|

24.09.2009, 18:24
|
|
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме: 193434
Репутация:
79
|
|
2InFlame
В отладчике пошагово выполни прогу и смотри что у тебя в стеке и какие левые операции компилятор вставил в твою функцию + документацию по gcc найди
|
|
|

27.09.2009, 00:58
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Сообщение от Hiro Protagonist
2desTiny
я не про depricated говорил вообщето
Код:
/GS [-]
Обнаружение некоторых возможных переполнений буфера, при которых перезаписывается возвращаемый адрес.
MSDN!
Оно работает таки )
Код:
int main(){
int a[100];
for (int j = 0; j < 1000; j++){
a[j] = j;
}
}
трям. VS2008 сказало, что сие есть ошибка без малейшего вопроса.
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

27.09.2009, 20:26
|
|
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме: 193434
Репутация:
79
|
|
ага, в дебаг версии оно тебе скажет конечно про переполнение. Только, что ты этим хотем показать?
|
|
|

27.09.2009, 20:39
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
да, видимо криво сказал. оно компилится, запускается и с самой чистой совестью затирает адрес возврата
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

27.09.2009, 23:11
|
|
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме: 193434
Репутация:
79
|
|
2desTiny
млин, ты бы хоть в вышеприведенный дизасм код посмотрел. Естественно затрется адрес возврата, НО защита не даст выйти из функции (и как результат, выполнить переход на шеллкод) и тихо убьёт процесс ExitProcess`ом. Так что креша приложения по исключению ты не наблюдал скорее всего (хотя опять же не помню с какой версии компилится с /GS по умолчанию, посмотри настройки проекта, чтото типа stack protection), а приложение тихо сдохло (это для релиз версии приминительно, насколько помню в дебаг версии там ещё перед убийством процесса окошко выдаёт, что буфер переполнился с минимальной инфой).
Последний раз редактировалось Hiro Protagonist; 27.09.2009 в 23:13..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|