首页
社区
课程
招聘
[求助]Win32ASM在变量定义的时候出现的奇怪问题===已解决
发表于: 2007-10-19 22:38 9075

[求助]Win32ASM在变量定义的时候出现的奇怪问题===已解决

2007-10-19 22:38
9075
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc
;include th32.inc
includelib kernel32.lib
includelib user32.lib
includelib advapi32.lib
includelib th32.lib
.data?
lpGetProcAddress dd ?;需要被写入远程线程的函数
lpGetModuleHandle dd ?
lplstrlen dd ?
lpSleep dd ?
lpFileName db 256 dup (?);写入远程线程的自身文件名,用于写入注册表
lpRemoteCode dd ?;远程线程开辟空间的起始地址
hModule dd ?
dwWinlogon dd ?;winlogon进程号
dwTemp dd ?
.const
szKernelDll db 'kernel32.dll',0
szGetProcAddress db 'GetProcAddress',0
szGetModuleHandle db 'GetModuleHandleA',0
szlstrlen db 'lstrlenA',0
szSleep db 'Sleep',0
szErrOpen db 'Can not open thread',0ah,0dh,0
szDebugName db 'SeDebugPrivilege',0
szWinlogonName db 'winlogon.exe',0
.code
include RemoteThread.asm
start:

        jmp @F
        hToken dd ?
        hProcess dd ?
        hToolHelp dd ?
        stTkp TOKEN_PRIVILEGES <>;调整权限
        stProcess PROCESSENTRY32 <>;查找winlogon进程
        @@:

;*************************************************************************
;调整当前进程的权限,设置成调试权限,才能打开winlogon
invoke GetCurrentProcess
invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hToken
invoke LookupPrivilegeValue,NULL,offset szDebugName,addr stTkp.Privileges[0].Luid
mov stTkp.PrivilegeCount,1
mov stTkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges,hToken,FALSE,addr stTkp,NULL,NULL,NULL
;***************************************************************************
;查找winlogon的进程号
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL
mov hToolHelp,eax
mov stProcess.dwSize,sizeof stProcess
invoke Process32First,hToolHelp,addr stProcess
mov ebx,eax
.while ebx==TRUE
mov stProcess.dwSize,sizeof stProcess
invoke Process32Next,hToolHelp,addr stProcess
lea edx,stProcess.szExeFile
invoke lstrcmp,edx,offset szWinlogonName
.if eax==0
push stProcess.th32ProcessID
pop dwWinlogon
.break
.endif
.endw
;***************************************************************************
;打开winlogon进程
;开辟空间
;写入进程数据

invoke OpenProcess,PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD,FALSE,dwWinlogon
.if eax
mov hProcess,eax
invoke VirtualAllocEx,hProcess,NULL,REMOTE_CODE_LENGTH,MEM_COMMIT,PAGE_EXECUTE_READWRITE
.if eax
mov lpRemoteCode,eax
invoke WriteProcessMemory,hProcess,lpRemoteCode,offset REMOTE_CODE_START, REMOTE_CODE_LENGTH,addr dwTemp
invoke lstrlen,offset lpFileName
add eax,sizeof dword*4
invoke WriteProcessMemory,hProcess,lpRemoteCode,offset lpGetProcAddress, eax,addr dwTemp
mov eax,lpRemoteCode
add eax,offset _RemoteThread-offset REMOTE_CODE_START
invoke CreateRemoteThread,hProcess,NULL,NULL,eax,0,0,NULL
invoke CloseHandle,eax
.endif
invoke CloseHandle,hProcess
.else
invoke MessageBox,NULL,offset szErrOpen,NULL,MB_OK or MB_ICONWARNING
.endif
invoke ExitProcess,NULL
end start

;以上代码提权失败!AdjustTokenPrivileges返回0

;*************************************************************************************/
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include advapi32.inc
;include th32.inc
includelib kernel32.lib
includelib user32.lib
includelib advapi32.lib
includelib th32.lib
.data?
lpGetProcAddress dd ?;需要被写入远程线程的函数
lpGetModuleHandle dd ?
lplstrlen dd ?
lpSleep dd ?
lpFileName db 256 dup (?);写入远程线程的自身文件名,用于写入注册表
lpRemoteCode dd ?;远程线程开辟空间的起始地址
hModule dd ?

hToken dd ?
hProcess dd ?
hToolHelp dd ?
stTkp TOKEN_PRIVILEGES <>;调整权限
stProcess PROCESSENTRY32 <>;查找winlogon进程

dwWinlogon dd ?;winlogon进程号
dwTemp dd ?
.const
szKernelDll db 'kernel32.dll',0
szGetProcAddress db 'GetProcAddress',0
szGetModuleHandle db 'GetModuleHandleA',0
szlstrlen db 'lstrlenA',0
szSleep db 'Sleep',0
szErrOpen db 'Can not open thread',0ah,0dh,0
szDebugName db 'SeDebugPrivilege',0
szWinlogonName db 'winlogon.exe',0
.code
include RemoteThread.asm
start:

;*************************************************************************
;调整当前进程的权限,设置成调试权限,才能打开winlogon
invoke GetCurrentProcess
invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hToken
invoke LookupPrivilegeValue,NULL,offset szDebugName,addr stTkp.Privileges[0].Luid
mov stTkp.PrivilegeCount,1
mov stTkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges,hToken,FALSE,addr stTkp,NULL,NULL,NULL
;***************************************************************************
;查找winlogon的进程号
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL
mov hToolHelp,eax
mov stProcess.dwSize,sizeof stProcess
invoke Process32First,hToolHelp,addr stProcess
mov ebx,eax
.while ebx==TRUE
mov stProcess.dwSize,sizeof stProcess
invoke Process32Next,hToolHelp,addr stProcess
lea edx,stProcess.szExeFile
invoke lstrcmp,edx,offset szWinlogonName
.if eax==0
push stProcess.th32ProcessID
pop dwWinlogon
.break
.endif
.endw
;***************************************************************************
;打开winlogon进程
;开辟空间
;写入进程数据

invoke OpenProcess,PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD,FALSE,dwWinlogon
.if eax
mov hProcess,eax
invoke VirtualAllocEx,hProcess,NULL,REMOTE_CODE_LENGTH,MEM_COMMIT,PAGE_EXECUTE_READWRITE
.if eax
mov lpRemoteCode,eax
invoke WriteProcessMemory,hProcess,lpRemoteCode,offset REMOTE_CODE_START, REMOTE_CODE_LENGTH,addr dwTemp
invoke lstrlen,offset lpFileName
add eax,sizeof dword*4
invoke WriteProcessMemory,hProcess,lpRemoteCode,offset lpGetProcAddress, eax,addr dwTemp
mov eax,lpRemoteCode
add eax,offset _RemoteThread-offset REMOTE_CODE_START
invoke CreateRemoteThread,hProcess,NULL,NULL,eax,0,0,NULL
invoke CloseHandle,eax
.endif
invoke CloseHandle,hProcess
.else
invoke MessageBox,NULL,offset szErrOpen,NULL,MB_OK or MB_ICONWARNING
.endif
invoke ExitProcess,NULL
end start

;以上代码提权成功!AdjustTokenPrivileges返回1

这两段代码,除了红色部分的位置不同,其他全部一样,
如果把那几个变量定义在数据段,没问题,成功了
可是如果把那几个变量定义在代码段,编译后把代码节的属性修改为E0000020,
那么提权就失败了!
更奇怪的是,传入AdjustTokenPrivileges的参数是相同的,地址里的内容也是相同的.
但结果就是不一样,不知道为什么,请各位指点下,先谢谢了!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
最新回复 (12)
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
align dword
stTkp TOKEN_PRIVILEGES <>;调整权限
stProcess PROCESSENTRY32 <>;查找winlogon进程

原来是对齐问题!
2007-10-19 23:23
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
3
你娃一天就不干好事,注入winlogo想要做啥子嘛???
2007-10-20 10:36
0
雪    币: 248
活跃值: (1081)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
自言自语还在瞢...

shellcode的一般次序:
kernel32.dll 的基址-->GetProcAddress-->LoadLibrary-->要用的API-->完成某功能。
XP SP2 以后的版本很难获取kernel32.dll 的基址。
2007-10-20 14:16
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
为什么阿?
我这里还算正常哈!
call/pop/sub组合
2007-10-21 19:49
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
6
老师让做的,

zjjmjtoot:老乡啊!
2007-10-21 19:49
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是什么对齐 还不明白 能说清楚点吗
2007-10-23 12:24
0
雪    币: 248
活跃值: (1081)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我这里还算正常哈!

奇怪!
call/pop/sub组合

只能定位SHELLCODE(变量、代码...)
不能定位在SHELLCODE中要用到的API地址。
2007-10-23 14:12
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
也是重庆呀,我还以为是我老乡呢
2007-10-23 14:50
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=sixL;373928]奇怪!

只能定位SHELLCODE(变量、代码...)
不能定位在SHELLCODE中要用到的API地址。[/QUOTE]

嘿嘿
让他自己去获取哈!
2007-10-24 12:00
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
11
你是哪点的?
2007-10-24 12:00
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
13
如果只编应用程序的话,了解API,比8086汇编还简单。
2007-10-24 14:32
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
自罚三杯先
2007-10-24 15:29
0
游客
登录 | 注册 方可回帖
返回
//