Сейчас на форуме: bartolomeo, asfa, _MBK_ (+7 невидимых)

 eXeL@B —› Вопросы новичков —› SEH etc.
. 1 . 2 . 3 . >>
Посл.ответ Сообщение

Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 09 ноября 2011 21:15
· Личное сообщение · #1

Здрасти

Такая вот задача. Есть ссылка. Нужно по этой ссылке прочитать значение так, чтобы всё не упало. Юзермод.

Сразу скажу что ставить сех не годно - код вне модуля. Посему скажу требования:

1. Код вне модулей, сех мы юзать не можем.
2. Про никакие модуля мы ничего не знаем, соответственно VEH мы заюзать не можем.
3. Всякие апи не доступны - про модуля ничего не известно.
4. Авер за нами следит, соответственно мы не можем дёрнуть то, что нельзя.

Предлагайте решение.




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

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

Через PEB добираемся до базы ntdll.dll. В секции .data ищем место, где есть нули, и пишем туда кодес с сех-обработчиком. Запись в секцию дата разрешена по дефолту:



делаем call на записанный код и либо читаем, либо нет, и попадаем в обработчик. В любом случае имеем безопасную функцию.

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




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 09 ноября 2011 22:08 · Поправил: bowrouco
· Личное сообщение · #3

ARCHANGEL
Сех не робит, ибо NX и DEP(/sageseh). Разбирать экспорт не катит, также и память сканить - можна на фолт нарваться.




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

Создано: 09 ноября 2011 22:13 · Поправил: ARCHANGEL
· Личное сообщение · #4

bowrouco
А этот код, который мы куда-то внедрили - на его внедрение есть какие-то ограничения? Ну, там, размер, ограничения по вызову API (типа, нельзя вызывать ничего из dll, кроме натива)?

Добавлено:
И что значит всякие АПИ не доступны, почему это?

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




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 10 ноября 2011 01:21
· Личное сообщение · #5

ARCHANGEL
В юзермоде можно конечно найти нт, разобрать там экспорт. Но в ядре это немного проблемно, можно отвалиться при обычном поиске вниз пе-хидера. Посему нужно както проверить валидность ссылки.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 10 ноября 2011 08:21 · Поправил: PE_Kill
· Личное сообщение · #6

Тогда решение. Находим базу kernel32 (например через список модулей в PEB), находим IsBadReadPtr и юзаем, профит.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 10 ноября 2011 10:41
· Личное сообщение · #7

PE_Kill
Пулучится большой код, в добавок не универсальный.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 10 ноября 2011 12:23 · Поправил: PE_Kill
· Личное сообщение · #8

Тогда я хз как это сделать универсально, компактно и подходящее под условия задачи.

PS Я кстати не понял, почему IsBadReadPtr не универсально.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 10 ноября 2011 12:37
· Личное сообщение · #9

PE_Kill
В ядре этой функции нет, в юзермоде придётся искать модуль, разбирать экспорт етц. Эти манипуляции большие и также могут потребовать проверку указателей.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 10 ноября 2011 12:41
· Личное сообщение · #10

bowrouco пишет:
В ядре этой функции нет

В ТЗ из шапки сказано, что это юзермод, ты уж определись.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 10 ноября 2011 12:48
· Личное сообщение · #11

PE_Kill
Юзермод.




Ранг: 88.2 (постоянный), 111thx
Активность: 0.070.01
Статус: Участник

Создано: 10 ноября 2011 13:32
· Личное сообщение · #12

Да троллит он...



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 10 ноября 2011 13:40
· Личное сообщение · #13

Airenikus
Ничего я не тролю. В ядре проще, можно както так:
Code:
  1. CHK_4R_KM macro p4R
  2. Local Load
  3.          push ebx
  4.          pushfd  ; IF
  5.          cli
  6.          mov ebx,p4R
  7.          sub esp,2*4
  8.          sidt [esp]
  9.          Call Load
  10.          add esp,4*4      ; !CF
  11.          jmp @f
  12. Load:
  13.          mov edx,[esp + 2]         ; IDT base
  14.          mov cx,[edx + 14*8 + 6]   ; hi ptr
  15.          mov ax,[edx + 14*8]       ; lo ptr
  16.          pop word ptr [edx + 14*8]
  17.          pop word ptr [edx + 14*8 + 6]
  18.          mov ebx,[ebx]    ; test R
  19.          stc     ; CF
  20. @@:
  21.          lea esp,[esp + 2*4]
  22.          mov [edx + 14*8],ax
  23.          mov [edx + 14*8 + 6],cx
  24.          popfd   ; IF
  25.          pop ebx
  26. endm

Но ядро это ядро, а в юзермоде всё заблочено защитой. Посему там сложнее чтото подобное провернуть.



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 10 ноября 2011 22:39
· Личное сообщение · #14

Передать адрес параметром в какой-нибудь сервис, вызывая оный через sysenter, и смотреть возвращённое значение.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 10 ноября 2011 23:06
· Личное сообщение · #15

vptrlx
Например ?



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 11 ноября 2011 00:32
· Личное сообщение · #16

ну берём первый попавшийся сервис NtAddAtom номер 8:
Code:
  1.          PUSH 0
  2.          PUSH esp ;param1
  3.          PUSH 2 ;param2
  4.          PUSH address ;param3
  5.          push 0
  6.          MOV EAX, 8
  7.          CALL @L
  8. @L:
  9.          ADD DWORD PTR SS:[ESP], 8
  10.          MOV EDX, ESP
  11.          SYSENTER

80000002 --- нет такого
0 --- есть
Если подставлять address не в param3, а в param1, то можно проверять, доступна ли память на запись



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 00:42 · Поправил: bowrouco
· Личное сообщение · #17

vptrlx
Code:
  1. ZwAcquireCMFViewOwnership:
  2.          mov eax,8
  3.          mov edx,7FFE0300
  4.          call dword ptr ds:[edx]
  5.          ret 0C

Не будет оно работать. Тока не предлагайте искать стабы по имени, это не годно.
Вдобавок STATUS_DATATYPE_MISALIGNMENT(80000002) обычно вертается при проверке выравнивания ссылки, тоесть до обращения к памяти.



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 11 ноября 2011 00:54 · Поправил: vptrlx
· Личное сообщение · #18

bowrouco пишет:
STATUS_DATATYPE_MISALIGNMENT(80000002)


Ой, сорри, ночь на дворе. Да, сначала стоит выровнять. Тогда C0000005 возвращается.

bowrouco пишет:
Не будет оно работать. Тока не предлагайте искать стабы по имени, это не годно.

Ну либо придумать сервис, который во всех осях одинаковый номер имеет [я сюда куда-то глянул http://hex.pp.ua/service-descriptor-table.php, до висты у AddAtom'а такой номер], либо ось отличить по вторичным признакам /для того же AddAtom'а надо всего лишь отличить семёрку от остальных/, у Вас с этим проблем быть не должно
Либо даже третий вариант: вызывать сервисы по очереди с номерами для всех осей. Тогда (при удачном выборе) либо все вернут ошибку, либо по крайней мере один отработает успешно.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 01:00
· Личное сообщение · #19

vptrlx
Можно ведь попасть на какуюнибудь NtShutdownSystem или другую не приятную функу. Кстати как аргументы в ядерный стек копируются ?



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 11 ноября 2011 01:39
· Личное сообщение · #20

bowrouco пишет:
Можно ведь попасть на какуюнибудь NtShutdownSystem

vptrlx пишет:
(при удачном выборе)

Стоит заранее номера выбрать, чтобы ничего критичного не произошло.

bowrouco пишет:
Кстати как аргументы в ядерный стек копируются ?

это вы к тому, что можно попробовать передать проверяемый адрес как адрес юзермодного стека?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 01:46
· Личное сообщение · #21

vptrlx
> это вы к тому, что можно попробовать передать проверяемый адрес как адрес юзермодного стека?

Ну это хороший наводящий вопрос.



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 11 ноября 2011 01:55
· Личное сообщение · #22

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

а с передачей вместо адреса стека — плохая идея. после sysexit'a упадёт на KiFastSystemCallRet



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 02:09 · Поправил: bowrouco
· Личное сообщение · #23

vptrlx
Почему же упадёт, не думаю. Смотрите, вот код копирующий аргументы в ядерный стек:
Code:
  1. KiSystemServiceRepeat:
  2.          ...
  3.          cmp esi,_MmUserProbeAddress
  4.          jae kss80        ; Ссылка на стек за пределами юзерспейса.
  5. KiSystemServiceCopyArguments:
  6.          rep movsd
  7. kssdoit:
  8.          call ebx         ; Nt*
  9. kss60:
  10.          ...
  11. kss80:
  12.          test byte ptr [ebp].TsSegCs,MODE_MASK
  13.          jz KiSystemServiceCopyArguments    ; KM, выполняем сервис, есть привилегии.
  14.          mov eax,STATUS_ACCESS_VIOLATION    ; Иначе AV.
  15.          jmp kss60        ; Возвращаемся из сервиса.

Видно что в ядре сервис пройдёт без проблем(ну пока не учитываем кодовый селектор, тут не важно). Ссылка на аргументы передаётся в регистре Edx. При копировании на инструкции KiSystemServiceCopyArguments возникнет #PF. Вот часть его:
Code:
  1. KiTrap0E()        ; #PF
  2.          ...
  3. Kt0e05a:
  4. ; Ebp:PKTRAP_FRAME
  5.          mov ecx,offset FLAT:KiSystemServiceCopyArguments
  6.          cmp [ebp].TsEip,ecx       ; Адрес фолта.
  7.          je short Kt0e06
  8.          ...
  9. Kt0e06:
  10.          mov ecx,[ebp].TsEbp       ; Т-фрейм на момент фолта.
  11.          test [ecx].TsSegCs,MODE_MASK
  12.          jz short Kt0e07  ; KM
  13.          mov [ebp].TsEip,offset FLAT:kss60  ; Адрес для отката фолта.
  14.          mov eax,STATUS_ACCESS_VIOLATION    ; AV.
  15.          mov [ebp].TsEax,eax       ; Статус.
  16.          jmp _KiExceptionExit      ; Kei386EoiHelper()
  17. Kt0e07:
  18.          ; Далее #AV разворачивается.

Проверяется адрес фолта(таких мест несколько). Если он на инструкции, копирующей аргументы, то фолт откатывается и возвращается STATUS_ACCESS_VIOLATION.
Аргуметны копируется двордами, число их описано в сст. Посему гранулярноть - 4 байта. Подойдёт почти любой сервис. Проще взять тот, который получает на вход хэндл. Причём без лишних аргументов, первый NtAlertThread. Его можно определить по возвращаемому статусу. Также если усечь буфер с аргументами, то можно определить число аргументов любого сервиса. Тоесть код:
Code:
  1. CHK_4R_UM macro p4R
  2. Local Exit
  3.          push p4R
  4.          xor ebx,ebx
  5.  @@:
  6.          mov edx,MM_SHARED_USER_DATA_VA + X86_PAGE_SIZE - sizeof(HANDLE)        ; 0x7FFE0FFC
  7.          mov eax,ebx
  8.          Int 2eh
  9.          cmp al,8
  10.          je @f
  11.          inc ebx
  12.          bt ebx,10
  13.          jnc @b
  14.          jmp Exit         ; !ZF
  15.  @@:
  16.          pop edx
  17.          mov eax,ebx
  18.          Int 2eh
  19.          cmp al,5
  20. ; ZF
  21. Exit:
  22. endm

Годится в юзермоде для проверки доступности 4-х байт на чтение.



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 11 ноября 2011 02:21 · Поправил: vptrlx
· Личное сообщение · #24

О, да, правильно. С int 2e получится. А с sysenter'ом — нет.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 02:36
· Личное сообщение · #25

vptrlx
Разница в модели формирования т-фрейма. Для сискола источник стек Edx.



Ранг: 56.1 (постоянный), 9thx
Активность: 0.040
Статус: Участник

Создано: 11 ноября 2011 10:50
· Личное сообщение · #26

я понимаю Я бы даже сказал, разница в строчке "esp <- ecx" в "operation", которой нет в iret, но есть в sysexit, который ещё и выходит на KiFastSystemCallRet, так что он должен откуда-то иметь валидный адрес стека, чтобы ret не уронил программу.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 11:01
· Личное сообщение · #27

vptrlx
Через инт ловили когдато инжекты всякие - создавалось несколько тредов, получали слепок(сисминфо) и первый поток там зацикливался на инт, причём с инвалидным стеком. Далее любая манипуляция с таким потоком завершала процесс.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 11 ноября 2011 13:38
· Личное сообщение · #28

Т.е. если вариант с sysenter подходит, то могу накидать шеллкод для проверки памяти на чтение. Правда навскидку пока только для буфера из 16 байт не меньше, что вполне приемлемо, хотя может и меньше можно.

-----
Yann Tiersen best and do not fuck




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 ноября 2011 21:08
· Личное сообщение · #29

PE_Kill
С сисколами ничего не будет. Стек восстанавливается в переданное значение. Хотя можно подобрать подходящий сервис. Интересно будет на ваше решение взглянуть. Хотя сразу скажу что скока живёт NT всегда юзали инты, а не сисколы. У последних кривая реализация. Так уж случилось что ядро кодили люди не особо далёкие.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 ноября 2011 20:46
· Личное сообщение · #30

Почекал, мой вариант тоже упирается в STATUS_DATATYPE_MISALIGNMENT. Зато пока чекал, нашел способ проверить адрес на возможность записи. Правда в данной задаче это не требуется, поэтому в топку.

-----
Yann Tiersen best and do not fuck



. 1 . 2 . 3 . >>
 eXeL@B —› Вопросы новичков —› SEH etc.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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