• XSS.stack #1 – первый литературный журнал от юзеров форума

Нулевой указатель

waahoo

ворчливый дед
Эксперт
Регистрация
01.12.2010
Сообщения
843
Реакции
1 661
Здрасте всем не спящим. Сегодня поведаю Вам об очень интересном трюке с нулевой памятью.
Суть вопроса:
Код:
xor eax,eax
mov eax,[eax]
более не приводит к фолту ибо есть способ выделения памяти по нулевому адресу. Как было выяснено в нашей любимой конфочке, Индек знал об этом уже несколько лет (кто бы сомневался) и упорно помалкивал. Но доблестные кетайцы всеже разведали эту фишку и поделились с нами. Для этого нужно лишь спуститься пониже WinApi и обратиться к NativeApi. Итак кодес:
Код:
local pBuf:dword, cbBuf:dword
...
	mov pBuf,1000h
	mov cbBuf,5000h
	invoke ZwAllocateVirtualMemory,-1,addr pBuf,0,addr cbBuf,MEM_TOP_DOWN or MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE
получается что мы просим у системы 5000h байт памяти по адресу 1000h в своем адресном пространстве, но т.к. адрес лежит "между-между" система его округляет вниз т.е. до нуля и спокойненько выделяет нужный кусочек памяти. Согласно всеми нами любимому мсдн'у, память в диапазоне 0-10000h не подлежит каким либо операциям, как видите это не так. Таким способом можно выделять память не только в своем процессе, но и в чужом, проверенно. Как это юзать думайте сами, самое простое антиэмуляция.

waahoo 2012 © Специально для DamageLab без разрешения неизвестного кетайского хакера.
 
Инде == неизвестный китайский хакер ?

и спокойненько выделяет нужный кусочек памяти.
на каких виндах тестили ?
 
Инде == неизвестный китайский хакер ?
нет, это реально кетаец, а индек сволочь помалкивал
на каких виндах тестили ?
хп и 7
скриншот с семерки прилагается:
image.png
 
Можно создать поток в обход диспетчера апк:
Код:
CreateHiddenThread proc uses ebx Ip:PVOID
Local Context:CONTEXT
Local RegionAddress:PVOID, RegionSize:ULONG
Local ThreadHandle:HANDLE
Local ClientId:CLIENT_ID
	mov RegionAddress,4
	mov RegionSize,PAGE_SIZE
	invoke ZwAllocateVirtualMemory, NtCurrentProcess, addr RegionAddress, 0, addr RegionSize, MEM_COMMIT or MEM_RESERVE or MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE
	invoke RtlCreateUserThread, NtCurrentProcess, NULL, TRUE, 0, NULL, NULL, -1, 0, addr ThreadHandle, addr ClientId
	mov Context.ContextFlags,CONTEXT_CONTROL or CONTEXT_SEGMENTS
	invoke ZwGetContextThread, ThreadHandle, addr Context
; Cs:Ip
	mov Context.regEip,1
	mov Context.regSegCs,0
	mov Context.regEFlags,EFLAGS_VM or EFLAGS_MASK
	mov ebx,Context.regEsp
	mov dword ptr ds:[1],90FEEBF9H; Stc/Jmp $ 
	invoke ZwSetContextThread, ThreadHandle, addr Context
	invoke ZwResumeThread, ThreadHandle, NULL
@@:
	invoke ZwGetContextThread, ThreadHandle, addr Context
	test Context.regEFlags,EFLAGS_CF
	jz @b
	invoke ZwSuspendThread, ThreadHandle, NULL
	mov ecx,Ip
	mov Context.regSegCs,KGDT_R3_CODE or RPL_MASK
	mov Context.regSegDs,KGDT_R3_DATA or RPL_MASK
	mov Context.regSegEs,KGDT_R3_DATA or RPL_MASK
	mov Context.regSegSs,KGDT_R3_DATA or RPL_MASK
	mov Context.regSegFs,KGDT_R3_TEB or RPL_MASK
	mov Context.regEsp,ebx
	mov Context.regEip,ecx
	mov Context.regEFlags,EFLAGS_MASK
	invoke ZwSetContextThread, ThreadHandle, addr Context
	invoke ZwFreeVirtualMemory, NtCurrentProcess, addr RegionAddress, addr RegionSize, MEM_RELEASE
	invoke ZwResumeThread, ThreadHandle, NULL
	ret
CreateHiddenThread endp

А есчо можно запустить ntvdm(при инициализации в ноль копируется часть физической памяти, IVT всякие).

Но обычно нулевая память юзается при эскалациях, на всяких разных уязвимостях, где можно писать в память нуль по произвольному адресу, создаётся SDT, записывается в нуле вызывается через сискол.

И это не китайцы придумали, ntvdm это юзает, в сплоитах вперывае вроде Рубен(он же вроде не китаец ?) применял http://reversemode.com/.
 

Вложения

  • Vdm.zip
    5.7 КБ · Просмотры: 18
уже как сто лет такое юзается в эксплуатациях, например в ms08-025 можно было записать ноль по любому адресу, стало быть передать управление на ноль. в других случая из-за некачественной проверки параметров возникают ситуации, что в параметре должна быть структура в которой должен быть скажем калбек, который вызывает привилегированный код, а получается что туда передается ноль, он проходит валидацию параметров и происходит вызов [0+pCallback].

на данный момент уже начинает терять актуальность, вроде как в х64 вендах запрещено юзать 64кб снизу и 64кб сверху, а в вот вот уже появившейся в8 так же по дефолту будет запрещен такой хек с нулем.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх