Помогите неопытному, IDA+ARM.

Тема в разделе "WASM.RESEARCH", создана пользователем wertyman, 25 май 2023.

  1. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Реверсю демона, опыта у меня с гулькин нос, вот только пришлось плотно взяться, раньше были только азы... И вот добрался уже до нужного мне места вроде как, и столкнулся с нелогичной ситуацией, как мне кажется.. И вот понять не могу, или я не правильно читаю код, или это IDA запуталась? У кого есть опыт, подскажите, что это, шум или ловушки от дизасма? Или все нормально, так и должно быть?

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

    Код (ASM):
    1. _generate_magic_number          ; int __cdecl generate_magic_number(int baseConst)
    2. _generate_magic_number          _generate_magic_number
    3. _generate_magic_number          ; __unwind {
    4. _generate_magic_number      000 PUSH    {R4,LR}
    5. _generate_magic_number+4    008 MOV     R4, R0          ; $r4 = 65537
    6. _generate_magic_number+8    008 MOV     R0, #0          ; timer
    7. _generate_magic_number+C    008 BL      time
    8. _generate_magic_number+10   008 BL      srand
    9. _generate_magic_number+14   008 BL      rand
    10. _generate_magic_number+18   008 CMP     R4, #65536      ; If base == 65536
    11. _generate_magic_number+1C   008 BEQ     loc_88A540      ; Then flag = 0
    12. _generate_magic_number+20   008 LDR     R3, =65537
    13. _generate_magic_number+24   008 CMP     R4, R3          ; else if base == 65537
    14. _generate_magic_number+28   008 BEQ     loc_88A51C      ; flag = 1
    15. _generate_magic_number+2C   008 CMP     R4, #0          ; else if base == 0
    16. _generate_magic_number+30   008 MOVEQ   R2, #2          ; flag = 2
    17. _generate_magic_number+34   008 BEQ     loc_88A520
    18. _generate_magic_number+38   008 MOV     R1, #0          ; else (base != 0) $r1 = 0
    19. _generate_magic_number+3C   008 BL      _some_sub_function ; and to gen function passed random number, getted at start
    20. _generate_magic_number+40   008 MOV     R0, R1          ; return 0
    21. _generate_magic_number+44   008 POP     {R4,PC}
    22. _generate_magic_number+48
    23. _generate_magic_number+48       loc_88A51C              ; flag = 1
    24. _generate_magic_number+48   008 MOV     R2, #1
    25. _generate_magic_number+4C
    26. _generate_magic_number+4C       loc_88A520
    27. _generate_magic_number+4C   008 LDR     R12, =someKeyData
    28. _generate_magic_number+50   008 ADD     LR, R12, R2,LSL#3
    29. _generate_magic_number+54   008 LDR     R2, [LR,#28]    ; "mac_num"
    30. _generate_magic_number+58   008 ADD     R1, R12, R2,LSL#2
    31. _generate_magic_number+5C   008 LDR     R1, [R1,#16]    ; seed2
    32. _generate_magic_number+60   008 BL      _some_sub_function
    33. _generate_magic_number+64   008 MOV     R0, R1
    34. _generate_magic_number+68   008 POP     {R4,PC}
    35. _generate_magic_number+6C
    36. _generate_magic_number+6C       loc_88A540              ; Then flag = 0
    37. _generate_magic_number+6C   008 MOV     R2, #0
    38. _generate_magic_number+70   008 B       loc_88A520
    39. _generate_magic_number+70       ; End of function _generate_magic_number
    40. _generate_magic_number+70
    Код (ASM):
    1. _some_sub_function          ; int __cdecl some_sub_function(int seed1)
    2. _some_sub_function          _some_sub_function
    3. _some_sub_function      000 CMP     R1, #0
    4. _some_sub_function+4    000 BEQ     loc_97B674
    5. _some_sub_function+8    000 PUSH    {R0,R1,LR}
    6. _some_sub_function+C    00C BL      _magic_function
    7. _some_sub_function+10   00C POP     {R1,R2,LR}
    8. _some_sub_function+14   000 MUL     R3, R2, R0
    9. _some_sub_function+18   000 SUB     R1, R1, R3
    10. _some_sub_function+1C   000 BX      LR
    11. _some_sub_function+1C       ; End of function _some_sub_function
    12. _some_sub_function+1C
    Первое что смущает, что нету пролога функции, что переход вначале идет на метку функции выше (_magic_function), где r0 устанавилвается в -1, если r0 == 0, и вызывается функция генерирующая исключение = 8:

    Код (ASM):
    1. _magic_function+1E0      loc_97B674
    2. _magic_function+1E0  000 CMP     R0, #0
    3. _magic_function+1E4  000 MOVNE   R0, #0xFFFFFFFF
    4. _magic_function+1E8  000 B       raise_signal_8
    5. _magic_function+1E8      ; End of function _magic_function
    6.  
    7. raise_signal_8          raise_signal_8
    8. raise_signal_8      000 PUSH    {R1,LR}
    9. raise_signal_8+4    008 MOV     R0, #8          ; sig
    10. raise_signal_8+8    008 BL      raise
    11. raise_signal_8+C    008 POP     {R1,PC}
    12. raise_signal_8+C        ; End of function raise_signal_8
    У меня закралась мысль, что может _some_sub_function, это типа макроса, проверяющий r1 и генерирующий исключение, но тогда он должен возвращать управление туда, где его вызывали же.. а там пролог начинается.. и еще смущает, что _some_sub_function после POP какие-то вычисления еще происходят, а возвращаемое значение не устанавливается и не проверяется после ее вызова, да и magic_function, там какие то арифмитические операции только, плюс на нее ссылается очень много кода, а там то же пролога нет и какая-то чехорда, как по мне.. Но у меня опыта нет, потому это может только мне кажется!?

    Код (ASM):
    1. _magic_function          _magic_function
    2. _magic_function      000 SUBS    R2, R1, #1
    3. _magic_function+4    000 BXEQ    LR
    4. _magic_function+8    000 BCC     loc_97B674
    5. _magic_function+C    000 CMP     R0, R1
    6. _magic_function+10   000 BLS     loc_97B658
    7. _magic_function+14   000 TST     R1, R2
    8. _magic_function+18   000 BEQ     loc_97B664
    9. _magic_function+1C   000 CLZ     R3, R0
    10. _magic_function+20   000 CLZ     R2, R1
    11. _magic_function+24   000 SUB     R3, R2, R3
    12. _magic_function+28   000 RSBS    R3, R3, #0x1F
    13. _magic_function+2C   000 ADDNE   R3, R3, R3,LSL#1
    14. _magic_function+30   000 MOV     R2, #0
    15. _magic_function+34   000 ADDNE   PC, PC, R3,LSL#2
    16. _magic_function+38   000 NOP
    17. _magic_function+3C   000 CMP     R0, R1,LSL#31
    18. _magic_function+40   000 ADC     R2, R2, R2
    19. _magic_function+44   000 SUBCS   R0, R0, R1,LSL#31
    20. _magic_function+48   000 CMP     R0, R1,LSL#30
    21. _magic_function+4C   000 ADC     R2, R2, R2
    22. _magic_function+50   000 SUBCS   R0, R0, R1,LSL#30
    23. _magic_function+54   000 CMP     R0, R1,LSL#29
    24. _magic_function+58   000 ADC     R2, R2, R2
    25. _magic_function+5C   000 SUBCS   R0, R0, R1,LSL#29
    26. _magic_function+60   000 CMP     R0, R1,LSL#28
    27. _magic_function+64   000 ADC     R2, R2, R2
    28. _magic_function+68   000 SUBCS   R0, R0, R1,LSL#28
    29. _magic_function+6C   000 CMP     R0, R1,LSL#27
    30. _magic_function+70   000 ADC     R2, R2, R2
    31. _magic_function+74   000 SUBCS   R0, R0, R1,LSL#27
    32. _magic_function+78   000 CMP     R0, R1,LSL#26
    33. _magic_function+7C   000 ADC     R2, R2, R2
    34. _magic_function+80   000 SUBCS   R0, R0, R1,LSL#26
    35. .............
    36.  
    Буду признателен за помощь)
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.992
    Ты по-моему чем-то не тем занят. Код выглядит абсолютно валидно. Пролог процедуре нужен для организации локальных переменных или сохранения значений регистров. Если ничего похожего нет, значит ничего такого и не надо. "Какая-то скучная арифметика" гоняет биты через cf-флаг и складывает в отдельном регистре, что это за арифметическая функция такая? Это криптография, и вероятно то, что ты ищешь. Но вместо этого над какими-то исключениями и прологами дрочишься.
     
  3. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Да просто меня смутило, что переход из одной функции в метку другой идет, это нормально? Не охота сидеть над задачей в пустую, если я что-то не правильно понимаю, т.к. опыта нет, буду разбирать дальше, а окажется, что это IDA глюкнула) Вот сомнения и проверяю свои...
    --- Сообщение объединено, 26 май 2023 ---
    Подскажите еще вот в этом фрагменте:
    Код (ASM):
    1. _generate_magic_number+4C   008 LDR     R12, =someKeyData
    2. _generate_magic_number+50   008 ADD     LR, R12, R2,LSL#3
    3. _generate_magic_number+54   008 LDR     R2, [LR,#0x1C]  ; "mac_num"
    Регистр LR работает как обычный регистр? Он разве не указывает на текущий адрес выполнения? Или он сохраняется там только при переходах B ?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.992
    Если внимательно присмотреться, это регистр, содержащий адрес возврата, а не счетчик команд. Здесь он используется чтобы данные адресовать, обычный базонезависимый код, галка в компилере.