Skip to content

ch0wzh3ng/gadgets_syscall

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gadgets_syscall

介绍

  • https://github.com/am0nsec/HellsGate 原地址
  • 为了防止EDR进行 syscall 调用验证 手动查找并执行ntdll中的syscall
  • 关键代码1:*((PBYTE)pFunctionAddress + i) == 0x0F && *((PBYTE)pFunctionAddress + i + 1) == 0x05 && *((PBYTE)pFunctionAddress + i + 2) == 0xC3
  • 关键代码2:syscall 替换成 jmp qword ptr [gad_gets_jmp_syscall]
  • 个人觉得作用不大 没啥用 仁者见仁智者见智

检测手段

  • AI 给的
方法1 RIP 是否位于 ntdll
进入内核时KiSystemCall64
CPU会保存用户态 RIP内核可以获取TrapFrame->Rip
如果发现RIP = 0x00007FF7xxxxxxx
属于你的EXE
而不是RIP = ntdll.dll
那么就是直接syscall这也是早期 Hell's Gate 被抓的原因。
方法2检查 syscall 指令来源
你的 gadget 最终会跳到syscall
ret
例如ntdll+0x123456
内核拿到 RIP RIPntdll ?
但很多 EDR 不止检查这个还会检查ReturnAddress
或者
CallStack
例如my.exe
 └─HellDescent
      └─ntdll+0x123456
            └─syscall
会发现NtOpenProcess
根本不在栈里方法3栈回溯最常见进入内核时RtlWalkFrameChain(...)
或者自己 unwind得到frame0 = ntdll!syscall
frame1 = my.exe
frame2 = my.exe
正常情况frame0 = ntdll!NtOpenProcess
frame1 = kernel32
frame2 = my.exe
于是就能发现syscall前没有NtOpenProcess
这是典型 indirect syscall 特征方法4验证 syscall stub
很多产品会预先记录NtOpenProcess:
4c 8b d1
b8 26 00 00 00
0f 05
c3
然后检查syscall执行地址
是否属于NtOpenProcess
NtAllocateVirtualMemory
NtWriteVirtualMemory
...
如果发现jmp到了NtClose里面的syscall
但是SSN = NtOpenProcess
就异常例如mov eax, 26h ; NtOpenProcess
jmp NtClose+12 ; syscall
这种 HalosGate/TartarusGate 很容易被检测方法5检测 Gadget 跳转
你的代码jmp qword ptr [gad_gets_jmp_syscall]
如果产品做用户态监控可以扫描mov eax, xx
jmp [xxx]
或者jmp r11
jmp rax
call rax
最终落点0f 05 c3
这种就是明显的 syscall gadget很多内存扫描器会专门找0F 05 C3
附近的引用

About

地狱之门的变种所谓的间接调用syscall (Indirect Syscalls)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors