R0 CREW

Обход условий в crackme

Привет уважаемые форумчане. Недавно начал решать одну crackme. Не могу обойти нижеописанные условия и буду очень благодарен, если вы мне поможите с решением т.к сам уже потратил кучу сил, но успеха до сих пор не имею(((

1.Выделено крастным, мне надо попасть в функцию showAlmost100, но условие cmp var_index, 0 не дает мне туда попасть т.к немного выше var_index инкреминтируеться( inc ecx , mov var_index, ecx)

2.Выделено зеленым, в eax загружается значение 41414141, а потом eax сравнивается со значением локальной переменной var_4 ( cmp [ebp+var_4], eax ) , причем var_4 всегда равна 0 т.к вызывается только здесь (см. скрин. ниже)

Буду Вам крайне признателен за помощь. Сам crackme -exe и файл от IDA , в нем нужную функцию назвал nessesaryFunction

Это не крэкми, а задача на эксплуатацию. Название говорит само за себя BOF32 (BOF - Buffer Overflow - переполнение буфера). В данном случае буфера расположенного на стеке.

Код Вами комментирован неверно.

.text:4141114E                 push    16
.text:41411150                 push    offset var_xz_nessesary_function
.text:41411155                 push    edx
.text:41411156                 call    xFunctionWrap   

Функция xFunctionWrap не просто копирует строку, а парсит ее, преобразовывая строковые представления в числовые по основанию 16.
Выполнить последнее условие проверки невозможно, как вы заметили, с учетом инкремента ECX. Первые две проверки легко проходятся.
Стек функции выглядит следующим образом.

-00000024 BUFFER          dd 8 dup(?)
-00000004 var_4           dd ?
+00000000  s              db 4 dup(?)
+00000004  r              db 4 dup(?)
+00000008 USER_PARAM      dd ? 

Размер буфера 8 двойных слов, а цикл позволяет нам поместить в него 128 значений, если при разборе строка не закончится или при ее разборе не будет ошибок. Что позволяет не только поместить в переменную var_4 необходимое значение (9е помещаемое число), но и перетереть адрес возврата из функции.

bof32.exe 41414141-1-1-1-1-1-1-1-41414141-1-414111D1 пройдет две проверки и без последней все равно даст сообщение об успехе.

bof32.exe 1-1-1-1-1-1-1-1-1-1-414111D1 не пройдет проверок (о чем будет сообщение), но сообщение об успехе будет.

Да, есть защита от отладки

.text:41411013 call ds:IsDebuggerPresent

Если будет обнаружен отладчик, то строка параметров заменяется на “lol”

.text:41411044                 push    'l'
.text:41411046                 pop     ecx
.text:41411047                 push    'o'
.text:41411049                 pop     eax
.text:4141104A                 mov     [edx+2], ax
.text:4141104E                 xor     eax, eax
.text:41411050                 mov     [edx], cx
.text:41411053                 mov     [edx+4], cx
.text:41411057                 mov     [edx+6], ax 

и понятно, что ничего не обрабатывается.

ЗЫ: И да, если запустить программу с ключем /extra, то будут обещаны плюшки если после эксплуатации программа не упадет, а выйдет в систему.
Extra points for not crashing the program after it displays success message (ideally app should return 0)

bof32.exe 41414141-1-1-1-1-1-1-1-41414141-1-414111E3-1-4141105F

или так только с первой успешной проверкой и тогда не будет промежуточного сообщения

bof32.exe 41414141-1-1-1-1-1-1-1-1-1-414111E3-1-4141105F

Спасибо, о гений, о ангел , о друг…