Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Реверсинг (https://forum.antichat.xyz/forumdisplay.php?f=94)
-   -   Переполнение буфера (https://forum.antichat.xyz/showthread.php?t=143005)

InFlame 22.09.2009 18:56

Переполнение буфера
 
Решил попрактиковаться в переполнении буфера. Накатал быстренько уязвимую программу. При передаче такого аргумента `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

Hiro Protagonist 22.09.2009 22:34

1. 0x8048407 <- что за адрес? включается ли он в образ проги в памяти
2. В студии (я как бэ виндовс секурити изучаю) по умолчанию включена проверка на переполненные буферы и по умолчанию будет отслеженна такая ситуация и прога будет по тихому прибита. Есть ли в gcc такая шняга я не знаю ...
3. В таких ситуациях надо вручную смотреть как происходит переполнение в отладчике иначе трудно чтолибо говорить.

desTiny 23.09.2009 22:23

>>. В студии (я как бэ виндовс секурити изучаю) по умолчанию включена проверка на переполненные буферы

ничего там не включено.только отвратительые ворнинги со словами юзайте _s или пишите CRT_SECURE_NO_DEPRECATE

2 ТС
запусти отладчик?

Hiro Protagonist 24.09.2009 01:03

2desTiny

я не про depricated говорил вообщето

Код:

/GS [-]
Обнаружение некоторых возможных переполнений буфера, при которых перезаписывается возвращаемый адрес.

MSDN!

Оно работает таки )

PHP код:


 sub_401000      proc near               
CODE XREFsub_401030+Ap
.text:00401000
.text:00401000 var_10          byte ptr -10h
.text:00401000 var_4           dword ptr -<- помещаем переменную между буфером и адресом возвратаetc
.text:00401000 arg_0           dword ptr  8
.text:00401000
.text:00401000                 push    ebp
.text:00401001                 mov     ebpesp
.text:00401003                 sub     esp10h
.text:00401006                 mov     eaxdword_40A000
.text:0040100B                 xor     eaxebp <- для каждой функции свое персональное значение
.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     esp8
.text:00401020                 mov     ecx, [ebp+var_4]
.
text:00401023                 xor     ecxebp <- в случае если буфер переполнитсялокальная переменная затрется
.text:00401025                 call    sub_401148 <- что и проверяется здесьесли она не соответствует постоянному значению процесс тихо прибъется.
.
text:0040102A                 mov     espebp
.text:0040102C                 pop     ebp
.text:0040102D                 retn
.text:0040102D sub_401000      endp 


InFlame 24.09.2009 13:57

2desTiny
я ведь выложил листинг с gdb. Ведь поидее после передачи 200 символов в 10-символьный буфер адрес возврата стопроцентно должен перезаписаться. А у меня вместо 0x41414141 в eip 0x8048407.
А, кстати, может ли это быть защита со стороны ОС или компилятора? Никакие патчи не ставил.

Hiro Protagonist 24.09.2009 18:24

2InFlame
В отладчике пошагово выполни прогу и смотри что у тебя в стеке и какие левые операции компилятор вставил в твою функцию + документацию по gcc найди

desTiny 27.09.2009 00:58

Цитата:

Сообщение от Hiro Protagonist
2desTiny

я не про depricated говорил вообщето

Код:

/GS [-]
Обнаружение некоторых возможных переполнений буфера, при которых перезаписывается возвращаемый адрес.

MSDN!

Оно работает таки )

Код:

int main(){
    int a[100];
        for (int j = 0; j < 1000; j++){
                a[j] = j;
        }
}

трям. VS2008 сказало, что сие есть ошибка без малейшего вопроса.

Hiro Protagonist 27.09.2009 20:26

ага, в дебаг версии оно тебе скажет конечно про переполнение. Только, что ты этим хотем показать?

desTiny 27.09.2009 20:39

да, видимо криво сказал. оно компилится, запускается и с самой чистой совестью затирает адрес возврата

Hiro Protagonist 27.09.2009 23:11

2desTiny
млин, ты бы хоть в вышеприведенный дизасм код посмотрел. Естественно затрется адрес возврата, НО защита не даст выйти из функции (и как результат, выполнить переход на шеллкод) и тихо убьёт процесс ExitProcess`ом. Так что креша приложения по исключению ты не наблюдал скорее всего (хотя опять же не помню с какой версии компилится с /GS по умолчанию, посмотри настройки проекта, чтото типа stack protection), а приложение тихо сдохло (это для релиз версии приминительно, насколько помню в дебаг версии там ещё перед убийством процесса окошко выдаёт, что буфер переполнился с минимальной инфой).


Время: 12:52