Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› Как использовать уязвимость переполнения буфера?
Посл.ответ Сообщение

Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 28 ноября 2014 18:45 · Поправил: ohos
· Личное сообщение · #1

Имеется исходник предыдущей версии программы и экзешник, а так же экзешник более поздней её версии без исходника (по иде код поменялся не сильно). Посмотрел на вики как выглядят ошибки переполнения буфера и уязвимости основанные на них, заметил, что в основном они идут от использования strcpy без проверок. Нашел в исходнике целевого приложении функцию

Code:
  1. bool     LUA_VMClass::CheckLuaFunc(string FuncName)
  2. {
  3. //       _strlwr( (char*)FuncName.c_str() );
  4.          std::transform( FuncName.begin(), FuncName.end(), FuncName.begin(), ::tolower );
  5.  
  6.          char szName[256];
  7.          strcpy( szName , FuncName.c_str() );
  8.  
  9. //       map<string,PlotRegStruct *,StringCmp>::iterator it;
  10.     map<string,PlotRegStruct *>::iterator it;
  11.          it = _PlotProc.find(FuncName);
  12.  
  13.          if(it == _PlotProc.end())
  14.                  return false;
  15.  
  16.          return true;
  17. }


Как видим тут локальная переменная char szName[256], на сколько я помню с курсов по C++ локальные переменные хранятся в стеке, следом за её объявлением идет уязвимый strcpy( szName , FuncName.c_str() ); без проверки на размер. При тесте подсовывание функции LUA_VMClass::CheckLuaFunc (в запущенном приложении средствами самого приложения) строки более чем в 256 символов привело к зависанию процесса (еще попробую проверить с IDA, точно ли в стек строка пишется), вероятнее всего из-за переполнения буфера и затирания правильного адреса возврата, т.к. при меньшем размере строки процесс не крашится.

Вопрос - есть ли толковое руководство (абы каких и поиском нашел, но они либо обрывочны, либо не содержат достаточно пояснений по достижению каждой значимой стадии и её проверки) по практическому использования уязвимости переполнения буфера? По ссылке на вики выше описаны лишь варианты техник без каких-то практически работающих примеров и пояснений как проверить ту или иную технику, как скомпоновать в дальнейшем строку с полезной нагрузкой.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 28 ноября 2014 19:21 · Поправил: ARCHANGEL
· Личное сообщение · #2

ohos

--> Раз <--
--> Два<--
--> Три <--
--> Четыре <--

Можно продолжать.

Ещё нужно помнить про аслр и stack canaries. Но это уже надо смотреть на бинарь и систему.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: ohos


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 28 ноября 2014 19:33
· Личное сообщение · #3

На дисках журнала хакер за 12-13 гг. видел несколько подобных видео - парнишка вручную сплоиты варганил под самопальные дырки. Довольно подробно показывал все. Можешь покопаться в сети - думаю найдешь. Если же нет - отпишись попробую свой архив поднять.



Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 02 декабря 2014 11:48
· Личное сообщение · #4

Начал с https://forum.reverse4you.org/showthread.php?t=1398, но возник вопрос связанный с metasploit'ом:

скачал metasploit framework http://downloads.metasploit.com/data/releases/metasploit-latest-windows-installer.exe, нашел в нем pattern_create.rb в C:\metasploit\apps\pro\msf3\tools, нужна ли активация версии community, чтобы воспользоваться этим .rb скриптом? если не нужна, то как его запустить? (полагаю, что это ruby скрипт, т.к. по записям в интернете 3 фреймворк перешел на ruby с perl)

p.s. для вопросов по metasploit создать отдельную тему или в этом спрашивать нормально?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 декабря 2014 12:28
· Личное сообщение · #5

Для изучения обычного переполнения буфера метасплоит-это явно оверкилл.
Кидай лучше вопросы сюда, ибо к данному форуму метасплоит не особо имеет отношение.
А как запускать скрипты руби, особенно мало отношения имеет. Не поверишь, но ruby.exe file.rb. И активация вряд ли понадобится, если надо просто поиграться с парой скриптов.

| Сообщение посчитали полезным: Rainbow


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 02 декабря 2014 12:44
· Личное сообщение · #6

Тыц
Тыц

Узри же истину !



Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 02 декабря 2014 17:49 · Поправил: ohos
· Личное сообщение · #7

заметил, что в статье https://forum.reverse4you.org/showthread.php?t=1398 при возникновении access violation EIP содержит измененное значение, а в моем случае хоть и происходит access violation, но уже при выполнении команды cmp и EIP не изменен, поэтому возникает два вопроса:

1. для успешной эксплуатации ошибки важно обязательно получить изменение EIP?
2. раз в моем случае EIP не затирается, значит ли это, что подаваемая строка может быть недостаточно длинной? (судя по исходному коду выше там размер 256, я же закидывал до 483, т.к. свыше 483 возникает уже другая ошибка не связанная с этой)

Код функции из первого поста в IDA

Code:
  1. .text:007BBEB0 sub_7BBEB0      proc near               ; CODE XREF: sub_7BC000+10Dp
  2. .text:007BBEB0                                         ; sub_7BC510+10Dp
  3. .text:007BBEB0
  4. .text:007BBEB0 var_154         = dword ptr -154h
  5. .text:007BBEB0 var_14E         = byte ptr -14Eh
  6. .text:007BBEB0 var_14D         = byte ptr -14Dh
  7. .text:007BBEB0 var_14C         = byte ptr -14Ch
  8. .text:007BBEB0 var_144         = byte ptr -144h
  9. .text:007BBEB0 var_13C         = byte ptr -13Ch
  10. .text:007BBEB0 var_134         = byte ptr -134h
  11. .text:007BBEB0 var_12C         = byte ptr -12Ch
  12. .text:007BBEB0 var_124         = byte ptr -124h
  13. .text:007BBEB0 Dest            = byte ptr -11Ch
  14. .text:007BBEB0 var_18          = dword ptr -18h
  15. .text:007BBEB0 var_14          = dword ptr -14h
  16. .text:007BBEB0 var_10          = dword ptr -10h
  17. .text:007BBEB0 var_C           = dword ptr -0Ch
  18. .text:007BBEB0 var_4           = dword ptr -4
  19. .text:007BBEB0 arg_0           = byte ptr  8
  20. .text:007BBEB0
  21. .text:007BBEB0                 push    ebp
  22. .text:007BBEB1                 mov     ebp, esp
  23. .text:007BBEB3                 push    0FFFFFFFFh
  24. .text:007BBEB5                 push    offset loc_88FCDD
  25. .text:007BBEBA                 mov     eax, large fs:0
  26. .text:007BBEC0                 push    eax
  27. .text:007BBEC1                 sub     esp, 148h
  28. .text:007BBEC7                 mov     eax, dword_92E4DC
  29. .text:007BBECC                 xor     eax, ebp
  30. .text:007BBECE                 mov     [ebp+var_10], eax
  31. .text:007BBED1                 push    eax
  32. .text:007BBED2                 lea     eax, [ebp+var_C]
  33. .text:007BBED5                 mov     large fs:0, eax
  34. .text:007BBEDB                 mov     [ebp+var_154], ecx
  35. .text:007BBEE1                 mov     [ebp+var_4], 0
  36. .text:007BBEE8                 mov     eax, ds:tolower
  37. .text:007BBEED                 push    eax
  38. .text:007BBEEE                 lea     ecx, [ebp+var_124]
  39. .text:007BBEF4                 push    ecx
  40. .text:007BBEF5                 lea     ecx, [ebp+arg_0]
  41. .text:007BBEF8                 call    ds:?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char>>::begin(void)
  42. .text:007BBEFE                 mov     edx, [eax+4]
  43. .text:007BBF01                 push    edx
  44. .text:007BBF02                 mov     eax, [eax]
  45. .text:007BBF04                 push    eax
  46. .text:007BBF05                 lea     ecx, [ebp+var_12C]
  47. .text:007BBF0B                 push    ecx
  48. .text:007BBF0C                 lea     ecx, [ebp+arg_0]
  49. .text:007BBF0F                 call    ds:?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char>>::end(void)
  50. .text:007BBF15                 mov     edx, [eax+4]
  51. .text:007BBF18                 push    edx
  52. .text:007BBF19                 mov     eax, [eax]
  53. .text:007BBF1B                 push    eax
  54. .text:007BBF1C                 lea     ecx, [ebp+var_134]
  55. .text:007BBF22                 push    ecx
  56. .text:007BBF23                 lea     ecx, [ebp+arg_0]
  57. .text:007BBF26                 call    ds:?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char>>::begin(void)
  58. .text:007BBF2C                 mov     edx, [eax+4]
  59. .text:007BBF2F                 push    edx
  60. .text:007BBF30                 mov     eax, [eax]
  61. .text:007BBF32                 push    eax
  62. .text:007BBF33                 lea     ecx, [ebp+var_13C]
  63. .text:007BBF39                 push    ecx
  64. .text:007BBF3A                 call    sub_5688D0
  65. .text:007BBF3F                 add     esp, 20h
  66. .text:007BBF42                 lea     ecx, [ebp+arg_0]
  67. .text:007BBF45                 call    ds:?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str(void)
  68. .text:007BBF4B                 push    eax             ; Source
  69. .text:007BBF4C                 lea     edx, [ebp+Dest]
  70. .text:007BBF52                 push    edx             ; Dest
  71. .text:007BBF53                 call    strcpy//вызов strcpy-------------------------
  72. .text:007BBF58                 add     esp, 8
  73. .text:007BBF5B                 lea     ecx, [ebp+var_18]
  74. .text:007BBF5E                 call    sub_5C0980
  75. .text:007BBF63                 lea     eax, [ebp+arg_0]
  76. .text:007BBF66                 push    eax
  77. .text:007BBF67                 lea     ecx, [ebp+var_144]
  78. .text:007BBF6D                 push    ecx
  79. .text:007BBF6E                 mov     ecx, [ebp+var_154]
  80. .text:007BBF74                 call    sub_7B56B0//-------------- падает где-то в этой функции, на svcr80.dll:78146B6A cmp     edx, [ecx-13h]
  81. .text:007BBF79                 mov     edx, [eax]
  82. .text:007BBF7B                 mov     eax, [eax+4]
  83. .text:007BBF7E                 mov     [ebp+var_18], edx
  84. .text:007BBF81                 mov     [ebp+var_14], eax
  85. .text:007BBF84                 lea     ecx, [ebp+var_14C]
  86. .text:007BBF8A                 push    ecx
  87. .text:007BBF8B                 mov     ecx, [ebp+var_154]
  88. .text:007BBF91                 call    sub_7E49F0
  89. .text:007BBF96                 push    eax
  90. .text:007BBF97                 lea     ecx, [ebp+var_18]
  91. .text:007BBF9A                 call    sub_8100B0
  92. .text:007BBF9F                 movzx   edx, al
  93. .text:007BBFA2                 test    edx, edx
  94. .text:007BBFA4                 jz      short loc_7BBFC5
  95. .text:007BBFA6                 mov     [ebp+var_14D], 0
  96. .text:007BBFAD                 mov     [ebp+var_4], 0FFFFFFFFh
  97. .text:007BBFB4                 lea     ecx, [ebp+arg_0] ; void *
  98. .text:007BBFB7                 call    ds:??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char>>::~basic_string<char,std::char_traits<char>,std::allocator<char>>(void)
  99. .text:007BBFBD                 mov     al, [ebp+var_14D]
  100. .text:007BBFC3                 jmp     short loc_7BBFE2
  101. .text:007BBFC5 ; ---------------------------------------------------------------------------
  102. .text:007BBFC5
  103. .text:007BBFC5 loc_7BBFC5:                             ; CODE XREF: sub_7BBEB0+F4j
  104. .text:007BBFC5                 mov     [ebp+var_14E], 1
  105. .text:007BBFCC                 mov     [ebp+var_4], 0FFFFFFFFh
  106. .text:007BBFD3                 lea     ecx, [ebp+arg_0] ; void *
  107. .text:007BBFD6                 call    ds:??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char>>::~basic_string<char,std::char_traits<char>,std::allocator<char>>(void)
  108. .text:007BBFDC                 mov     al, [ebp+var_14E]
  109. .text:007BBFE2
  110. .text:007BBFE2 loc_7BBFE2:                             ; CODE XREF: sub_7BBEB0+113j
  111. .text:007BBFE2                 mov     ecx, [ebp+var_C]
  112. .text:007BBFE5                 mov     large fs:0, ecx
  113. .text:007BBFEC                 pop     ecx
  114. .text:007BBFED                 mov     ecx, [ebp+var_10]
  115. .text:007BBFF0                 xor     ecx, ebp
  116. .text:007BBFF2                 call    sub_86DDB2
  117. .text:007BBFF7                 mov     esp, ebp
  118. .text:007BBFF9                 pop     ebp
  119. .text:007BBFFA                 retn    1Ch
  120. .text:007BBFFA sub_7BBEB0      endp





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 декабря 2014 18:02
· Личное сообщение · #8

stack cookies же! Вообще с банальным переполнением опоздал лет на 10. В чистом виде он уже почти не встречается в современном софте.



Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 02 декабря 2014 18:21 · Поправил: ohos
· Личное сообщение · #9

Stack cookie подтвердить или опровергнуть пока-что не могу, т.к. размера строки похоже просто не хватает, чтобы затереть стек по самый return.

На счет современности наоборот, все сходится - она как раз разрабатывалась где-то в 2003-2005 возможно кучей не очень опытных азиатов и индусов, незащищенных strcpy в ней очень много (около 200), как и ошибок со слишком длинными строками за историю её существования.

Похоже падение запущенного процесса и наблюдение при этом в дебаггере ошибки обращения к адресу являющемуся символами из поданной строки это подтверждают, просто уперся в ограничение размера подаваемой строки в текущем выбранном месте, ищу пока другие места где 483 символов хватит.

К тому же прога работает на 2003 сервере майкрософта.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 декабря 2014 19:11
· Личное сообщение · #10

Я могу подтвердить куки
.text:007BBEC1 sub esp, 148h
.text:007BBEC7 mov eax, dword_92E4DC
.text:007BBECC xor eax, ebp
.text:007BBECE mov [ebp+var_10], eax
это она и есть. Стало быть, в лучшем случае похеришь плюшку, и софт аварийно завершится на её проверке, видимо, здесь
.text:007BBFF2 call sub_86DDB2




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 02 декабря 2014 19:28
· Личное сообщение · #11

для расчета расстояния до адреса возврата нужно учесть
1) Dest = byte ptr -11Ch
2) .text:007BBEB0 push ebp
3) .text:007BBEB3 push 0FFFFFFFFh
4) .text:007BBEB5 push offset loc_88FCDD
5) .text:007BBEC0 push eax

т.е. 284+4+4+4+4=300 байт --> дальше идет адрес. Так что 483 с головой перетирают.

так вот 3-4-5 и есть Stack cookie которые ты перетираешь добираясь до адреса возврата и это не требует подтверждения или опровержения.

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 декабря 2014 20:37
· Личное сообщение · #12

OKOB
3-4-5 - это не плюшка, а сех. Плюшку я выше написал.



Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 10 декабря 2014 10:12 · Поправил: ohos
· Личное сообщение · #13

Archer пишет:
Я могу подтвердить куки
.text:007BBEC1 sub esp, 148h
.text:007BBEC7 mov eax, dword_92E4DC
.text:007BBECC xor eax, ebp
.text:007BBECE mov [ebp+var_10], eax
это она и есть. Стало быть, в лучшем случае похеришь плюшку, и софт аварийно завершится на её проверке, видимо, здесь
.text:007BBFF2 call sub_86DDB2


Спасибо, а все эти строки представляют stack cookie или только вызов sub_86DDB2?

Его псевдокод

Code:
  1. int __thiscall sub_86DDB2(void *this, char a2)
  2. {
  3.   if ( this == (void *)dword_92E4DC )
  4.     __asm { rep retn }
  5.   return __report_gsfailure(a2);
  6. }


и ассемблерный

Code:
  1. .text:0086DDB2 ; =============== S U B R O U T I N E =======================================
  2. .text:0086DDB2
  3. .text:0086DDB2
  4. .text:0086DDB2 sub_86DDB2      proc near               ; CODE XREF: _main+2EBp
  5. .text:0086DDB2                                         ; sub_53A2E0+F8p ...
  6. .text:0086DDB2                 cmp     ecx, dword_92E4DC
  7. .text:0086DDB8                 jnz     short loc_86DDBC
  8. .text:0086DDBA                 rep retn
  9. .text:0086DDBC ; ---------------------------------------------------------------------------
  10. .text:0086DDBC
  11. .text:0086DDBC loc_86DDBC:                             ; CODE XREF: sub_86DDB2+6j
  12. .text:0086DDBC                 jmp     ___report_gsfailure
  13. .text:0086DDBC sub_86DDB2      endp
  14. .text:0086DDBC


dword_92E4DC содержит 0BB40E64E, заметил, что при нажатии X на названии функции sub_86DDB2 в IDA вылезет список с ~3400 мест вызовов этой функции

Добавлено спустя 6 часов 27 минут
Спасибо всем кто помог, но думаю забросить это дело. Даже если исходник и старый, компилятор был наверняка новый (2012 студия или около того). Бороться со всякими защитами от ошибок переполнения думаю будет весьма тяжко и далеко не факт что успешно. Отсутствие опыта напрочь убивает и желание этим париться, попробую найти другие пути решения


 eXeL@B —› Программирование —› Как использовать уязвимость переполнения буфера?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати