[翻译]教你如何编译Exploits

[翻译]教你如何编译Exploits

文章作者:Outlaws
译文作者:ㄨiaoC
信息来源:邪有暗香盈袖恶八进制信息安全团队(www.eviloctal.com

本文始发于(www.h4cky0u.org),后经译者友情提交到邪有暗香盈袖恶八进制官方讨论组。

指导:如何编译Exploits
===============
Exploits是用C,VB等程序创建的,他有开源的优势。
这个向导将要教你如何建立一个exploit用cygwin。

在下面的步骤里 我将向你演示如何用cygwin编译一个5000端口的exploit,
但是你可以做同样的另一些端口的exploit从以下的地址下载:

- Google.com
- Securiteam.com
- K-otik.com
- Astalavista.box.sk
- Coromputer.net
- Securityfocus.com

(搜索exploit像:“exploit for port number”)

第一步:下载一个5000端口的exploit通常那个exploit的扩展名是.txt 你需要把它修改成.c

从这里下载:http://planet.nana.co.il/progroup/exploits/5000e.zip

在下载完和摘录这个exploit后,我们需要编译它(把它变成.exe的文件),我们需要用cygwin编译这个exploit。

从这里下载:http://sources.redhat.com/cygwin/setup.exe

第二步:打开Cygwin的安装文件setup.exe然后按照下面的图安装它。

第三步:在安装完cygwin之后,我们需要编译exploit,把那个exploit代码5000.c放到C:\cygwin\bi目录里面。
然后运行命令从 开始-运行-cmd
在命令行下输入
CD c:\cygwin\bin
gcc 5000.c -o 5000.exe

(CD = Open)

或者用下面图片的方式:

第四步:在我们完成编译之后,我们就可以使用它了 :)
连接那个有漏洞的电脑(已打开5000端口的)
开始-运行-cmd

然后输入:
CD c:\cygwin\bin
5000.exe XXX.XXX.XXX.XXX -e
(XXX.XXX.XXX.XXX = 受害电脑的ip地址)

或者按下面图片的操作

哇!你连接到了~~~

===========================
Outlaws指导

ㄨiaoC翻译

Posted in 心情随笔 | Leave a comment

logo发布拉~

还不错

logo.gif

Posted in 心情随笔 | Leave a comment

“魙鋡”

作者:tombkeeper

Continue reading

Posted in 未分类 | Leave a comment

关于信息安全和安全漏洞的一些科普——从支付宝控件漏洞谈起

转自安全焦点

Continue reading

Posted in 未分类 | Tagged , , , , , | Leave a comment

Windows软件防火墙实现技术简述

来源:安全焦点

author : baiyuanfan
mail : baiyuanfan@163.com
July 1st 2006

关键字:
封包过滤技术,NDIS钩子,应用程序访问网络控制,TDI钩子,智能行为监控,反流氓软件,自我保护技术。

本文简要介绍了目前流行的Windows软件防火墙的各个功能组件,及其实现方法。

内容目录:
Windows软件防火墙的发展概况
封包过滤技术
应用程序访问网络控制
智能行为监控
反流氓软件技术
自我保护技术
附录

Windows软件防火墙的发展概况

从Windows软件防火墙的诞生开始,这种安全防护产品就在跟随着不断深入的黑客病毒与反黑反毒之争,不断的进化与升级。从最早期的只能分析来源地址,端口号以及未经处理的报文原文的封包过滤防火墙,后来出现了能对不同的应用程序设置不同的访问网络权限的技术;近年来由ZoneAlarm等国外知名品牌牵头,还开始流行了具有未知攻击拦截能力的智能行为监控防火墙;最后,由于近来垃圾插件和流氓软件的盛行,很多防火墙都在考虑给自己加上拦截流氓软件的功能。综上,Windows软件防火墙从开始的时候单纯的一个截包丢包,堵截IP和端口的工具,发展到了今天功能强大的整体性的安全套件。
接下来本文就对一个Windows软件防火墙应当拥有的这些组件进行一个简要的技术介绍。

封包过滤技术

封包过滤技术是最原始的防火墙所拥有的第一种功能。但是该功能简单强大,直到现在都是任何一个防火墙必不可少的功能。
想要在网络数据包到达应用程序之前拦截之,就要在系统的网络协议栈上面安装过滤钩子。对Windows NT系列内核来说,可能安装过滤钩子的地方大致是这么几个,从高层到底层排序:SPI层(早期的天网防火墙),AFD层(资料缺乏,尚无例子),TDI层(不少国内墙),NDIS层(ZoneAlarm,Outpost等)。越位于高层,则产品开发难度越低,但是功能越弱,越容易被攻击者所穿越。由于 NDIS层的防火墙具有功能强大,不易被穿透等优点,近来各大防火墙厂商的趋势是选择NDIS层来做包过滤。
目前比较流行的NDIS钩子技术有两种。一种是挂接ndis.sys模块的导出函数,从而能够在每个ndis protocol注册的时候截获其注册过程,从而替换其send(packets)handler和receive(packet)handler。这个方法的缺点是在第一次安全之后无法立刻生效,必须要重起一次,而且要禁用的话,也必须重起。
2004年12月的时候,www.rootkit.com上面的一名黑客发表了一篇著名的文章:"Hooking into NDIS and TDI, part 1"(http://www.rootkit.com/newsread.php?newsid=219)。这篇文章本意是为rootkit作者们提供一种挂接底层驱动实现端口重用的方法,但是这篇文章揭示了一个全新的技术:通过动态的注册ndis假协议,可以获得ndis protocol的链表地址。得到这个地址之后就能不通过重起,就能替换并监控每个ndis protocol的send(packets)handler和receive(packet)handler,并且可以动态的卸载监控模块不需要重起。在这篇文章出现之后,很多防火墙厂商都悄悄地对自己的产品进行了升级。目前的ZoneAlarm等产品就是使用这种技术,可以在安装后即时发挥作用。这个例子更充分的体现了,黑客和反黑技术本来就是相辅相成的,本源同一的。

这里给出一个寻找该链表头的代码例子:
该函数返回的NDIS_HANDLE就是链表头地址。

NDIS_HANDLE RegisterBogusNDISProtocol(void)
{
NTSTATUS Status = STATUS_SUCCESS;
NDIS_HANDLE hBogusProtocol = NULL;
NDIS_PROTOCOL_CHARACTERISTICS BogusProtocol;
NDIS_STRING ProtocolName;

NdisZeroMemory(&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
BogusProtocol.MajorNdisVersion = 0x04;
BogusProtocol.MinorNdisVersion = 0x0;

NdisInitUnicodeString(&ProtocolName,L"BogusProtocol");
BogusProtocol.Name = ProtocolName;
BogusProtocol.ReceiveHandler = DummyNDISProtocolReceive;
BogusProtocol.BindAdapterHandler = dummyptbindadapt;
BogusProtocol.UnbindAdapterHandler = dummyptunbindadapt;

NdisRegisterProtocol(&Status,&hBogusProtocol,&BogusProtocol,
sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

if(Status == STATUS_SUCCESS){ return hBogusProtocol;}
else {
#ifdef bydbg
DbgPrint("ndishook:cannot register bogus protocol:%x\n",Status);
DbgBreakPoint();
#endif
return NULL;
}
}

得到这个ndis protocol的链表后,遍历表中的每一个ndis protocol,对于每一个ndis protocol,又各有一个链表,用来描述和该ndis protocol有联系的所有ndis miniport和该ndis protocol绑定的状态。每个这种状态块,叫做一个ndis open block。每个绑定的send(packets)handler和receive(packet)handler都在这个ndis open block里面。

struct _NDIS_OPEN_BLOCK
{
#ifdef __cplusplus
NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
#else
NDIS_COMMON_OPEN_BLOCK;
#endif

#if defined(NDIS_WRAPPER)

//
// The stuff below is for CO drivers/protocols. This part is not allocated for CL drivers.
//
struct _NDIS_OPEN_CO
{
....
};
#endif
};

typedef struct _NDIS_COMMON_OPEN_BLOCK
{
PVOID MacHandle; // needed for backward compatibility
NDIS_HANDLE BindingHandle; // Miniport's open context
PNDIS_MINIPORT_BLOCK MiniportHandle; // pointer to the miniport
PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol
NDIS_HANDLE ProtocolBindingContext;// context when calling ProtXX funcs
PNDIS_OPEN_BLOCK MiniportNextOpen; // used by adapter's OpenQueue
PNDIS_OPEN_BLOCK ProtocolNextOpen; // used by protocol's OpenQueue
NDIS_HANDLE MiniportAdapterContext; // context for miniport
BOOLEAN Reserved1;
BOOLEAN Reserved2;
BOOLEAN Reserved3;
BOOLEAN Reserved4;
PNDIS_STRING BindDeviceName;
KSPIN_LOCK Reserved5;
PNDIS_STRING RootDeviceName;

//
// These are referenced by the macros used by protocols to call.
// All of the ones referenced by the macros are internal NDIS handlers for the miniports
//
union
{
SEND_HANDLER SendHandler;
WAN_SEND_HANDLER WanSendHandler;
};
TRANSFER_DATA_HANDLER TransferDataHandler;

//
// These are referenced internally by NDIS
//
SEND_COMPLETE_HANDLER SendCompleteHandler;
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
RECEIVE_HANDLER ReceiveHandler;
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
WAN_RECEIVE_HANDLER WanReceiveHandler;
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;

//
// NDIS 4.0 extensions
//
RECEIVE_PACKET_HANDLER ReceivePacketHandler;
SEND_PACKETS_HANDLER SendPacketsHandler;

//
// More Cached Handlers
//
RESET_HANDLER ResetHandler;
REQUEST_HANDLER RequestHandler;
RESET_COMPLETE_HANDLER ResetCompleteHandler;
STATUS_HANDLER StatusHandler;
STATUS_COMPLETE_HANDLER StatusCompleteHandler;

#if defined(NDIS_WRAPPER)
....
#endif

} NDIS_COMMON_OPEN_BLOCK;

需要处理的,是ndis open block里面的SendHandler,ReceiveHandler,WanReceiveHandler,ReceivePacketHandler和SendPacketsHandler。

一定要注意的是,不同于很多文章中的描述,主要处理SendHandler和ReceiveHandler,正确的应该是主要处理ReceivePacketHandler和SendPacketsHandler,现在的主流网卡和系统驱动,都是使用后面两者。

应用程序访问网络控制

以往的防火墙只能古板的允许或者禁止整个系统去访问网络上的目标,比如允许了系统可以访问外网的http端口,就允许了所有进程,不能只控制IE 等几个进程有权这样做。该技术的出现解决了这个问题,对每个陌生的进程都会询问客户是否允许访问网络,因此还有一定的查杀未知木马病毒的能力。
由于NDIS里面的那些send/receive handler全都是由tdi缓冲之后再调用的,运行的上下文全都是kernel,并且不保存原先进行tdi操作的进程号,因此在封包过滤的NDIS钩子层次无法取得进行操作的进程ID。想要解决应用程序访问网络控制的问题,就需要在tdi或者更高的层次上使用钩子。一般来说,主流是使用tdi钩子,在进程的网络调用栈进行到tdi的TDI_CONNECT,TDI_LISTEN,TDI_RECEIVE,TDI_SET_EVENT_HANDLER等调用时,进行进程判断和提示。
对于winsock的应用程序来说,最重要的是主动连接请求,TDI_CONNECT;接受连接请求, TDI_SET_EVENT_HANDLER中的TDI_EVENT_CONNECT。对于udp收发,还要处理TDI_SEND_DATAGRAM, TDI_RECEIVE_DATAGRAM和TDI_SET_EVENT_HANDLER中的TDI_EVENT_RECEIVE_DATAGRAM请求。这个时候,直接PsGetCurrentProcessId就可以得到进程号。
tdi钩子有一个问题,就是对于TDI_SET_EVENT_HANDLER的hook,很可能不能及时发挥作用,必须要重起以后。由于不像 ndis钩子需要hook系统函数或者修改系统数据结构,tdi钩子可以直接使用微软提供的过滤器驱动程序接口,在安装编写上要比ndis钩子简单的多, IoAttachDeviceToDeviceStack就可以了。
给出一段detour的tdi的dispatch routine的代码:

NTSTATUS hook_disp(IN PDEVICE_OBJECT parampdrvob, IN PIRP irp)
{
....

case IRP_MJ_INTERNAL_DEVICE_CONTROL:
switch(irpsp->MinorFunction)
{
///原来想得要监控的几个似乎afd并不使用,而是用set event handler
case TDI_LISTEN:
#ifdef bydbg
DbgPrint("bytdiflt:TDI_LISTEN traped.should caused by kmd other than AFD.\n");

#endif
stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********\n",stat);
#endif
if(stat==0 || stat==-1){break;}//non-tcp or internal error
if(denyport[(unsigned short)stat]==1)//直接失败请求
{
#ifdef bydbg
DbgPrint("bytdiflt:*********port %d blocked!!*********\n",stat);
//DbgBreakPoint();
#endif
stat=STATUS_ACCESS_VIOLATION;
irp->IoStatus.Status=stat;
irp->IoStatus.Information=0;
IoCompleteRequest(irp, IO_NO_INCREMENT);

return stat;
}
break;

case TDI_RECEIVE:
#ifdef bydbg
DbgPrint("bytdiflt:TDI_RECEIVE traped.should caused by kmd other than AFD.\n");
//DbgBreakPoint();
#endif
break;
case TDI_SET_EVENT_HANDLER:
#ifdef bydbg
DbgPrint("bytdiflt:TDI_SET_EVENT_HANDLER traped.req local_node:%x\n",irpsp->FileObject);
DbgPrint("TDI_SET_EVENT_HANDLER EventType:%d EventHandler:%x EventContext:%x\n",
((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType,
((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventHandler,
((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventContext
);
#endif
switch(((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType){
case TDI_EVENT_CONNECT:
tmpstrptr="TDI_EVENT_CONNECT";
stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********\n",stat);
#endif
if(stat==0 || stat==-1){break;}//non-tcp or internal error
if(denyport[(unsigned short)stat]==1)//完成请求但不做事情
{
#ifdef bydbg
DbgPrint("bytdiflt:*********port %d blocked!!*********\n",stat);
//DbgBreakPoint();
#endif
stat=STATUS_SUCCESS;
irp->IoStatus.Status=stat;
irp->IoStatus.Information=0;
IoCompleteRequest(irp, IO_NO_INCREMENT);
return stat;
}
break;

case TDI_EVENT_RECEIVE:
tmpstrptr="TDI_EVENT_RECEIVE";
break;
case TDI_EVENT_CHAINED_RECEIVE:
tmpstrptr="TDI_EVENT_CHAINED_RECEIVE";
break;
case TDI_EVENT_RECEIVE_EXPEDITED:
tmpstrptr="TDI_EVENT_RECEIVE_EXPEDITED";
break;
case TDI_EVENT_CHAINED_RECEIVE_EXPEDITED:
tmpstrptr="TDI_EVENT_CHAINED_RECEIVE_EXPEDITED";
break;
case TDI_EVENT_RECEIVE_DATAGRAM:
tmpstrptr="TDI_EVENT_RECEIVE_DATAGRAM";
break;

default:
tmpstrptr="Other TDI_EVENT";
break;
}
#ifdef bydbg
DbgPrint("EventType is:%s\n",tmpstrptr);
#endif
break;
case TDI_CONNECT://处理主动外出连接
stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
if(stat==0 || stat==-1)//non-tcp or internal error
{DbgPrint("bytdiflt:**********TDI_CONNECT local port UNKNOWN.***********\n");}
else
{DbgPrint("bytdiflt:**********TDI_CONNECT local port:%d.************\n",stat);}
//DbgBreakPoint();
#endif
break;

....

PsGetCurrentProcessId....//判断进程号

....
}
智能行为监控

随着防火墙的发展,现在的ZoneAlarm,Kaspersky等都发展成了所谓的"安全套件",能够多方位的保护用户的系统。查杀未知的病毒和木马是所有防火墙厂商都非常注视的一环。在目前来说,查杀未知病毒木马,最行之有效的方法,就是类似于ZoneAlarm,Karpasky Internet Security,Mcafee,System Safety Monitor等安全工具的智能行为监控手段。实践证明,这种智能行为监控针对未知的恶意软件有着强大的杀伤力。例如,灰鸽子无论如何加壳变形,能够躲过杀毒软件的查杀,也不能逃避ZoneAlarm的智能行为监控;很多地下流传的没有公开的木马,放上去安装,在安装过程中也一样会报警;甚至很多0day overflow exploit在执行过程中就会报警。可以说,这个可能是目前最有前景的防火墙新技术。

例如,一个智能行为监控模块,可以监控以下进程行为,并且判定为恶意软件或者提示用户,让用户选择是否允许:

把自己注册成每次开机自动启动;

装载可疑的内核驱动程序;

注册未知的新服务;

修改或者替换系统重要文件;

使用raw_socket接口;

可疑的word宏或者脚本;

可疑的邮件附件例如可执行程序;

安装windows消息钩子;

创建远程线程到其他程序;

创建受控制的傀儡进程;

对系统API的请求来源代码和数据区在同一区域;

监控上述的这些行为,全部都可以使用系统钩子,消息钩子和API钩子等技术来实现,洗劫这里就不详细谈了,熟悉hook的技术人员都应该知道怎么做了。

反流氓软件技术

目前的信息安全领域,由于病毒的不可控性和黑客的技术门槛提高,黑客攻击和病毒攻击均有大幅度减少的趋势。但是一种新型的安全威胁却在日益的发展壮大,这种很不同于传统病毒的安全威胁,就是从开始就彻底的有明确商业目的的流氓软件。这种软件为了自己的商业利益,不惜牺牲客户的权益,强行在客户的浏览器上安装,驻留系统,强制制止用户卸载或者删除自己。这类软件也带来了非常大的麻烦,经常性地弹出广告页面,篡改用户浏览器主页,篡改用户浏览器搜索引擎,降低用户系统性能,更严重的是很多设计低劣的流氓软件会让用户的系统变得很不稳定,经常性的死机和重起。大量的防火墙客户对流氓软件深恶痛绝,希望防火墙能够在流氓软件安装的时候能够提示客户,给客户一个选择的机会。因此这也成了新一代防火墙应该拥有的功能模块。
由于流氓软件不同于一般病毒木马,有着强大的商业支持,升级换代非常快,并且碍于各方面的影响,防火墙和杀毒软件不好将其作为病毒木马来查杀,否则可能会引起法律和商业等背景关系上面的很多问题,所以比较好的一个选择,就是防火墙厂商使用行为监控方法来提示用户流氓软件的安装。

流氓软件除了拥有普通木马或病毒的以下几个特征,

把自己注册成每次开机自动启动;

装载可疑的内核驱动程序;

注册未知的新服务;

之外,还有一个很重要的特征就是劫持浏览器。以下的为了避免麻烦,均不举软件实例。

HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects,这个被叫做BHO插件的东西,是最多流氓软件和ie插件的栖身之所,监控这个健值是最重要的;

HKCU\Software\Microsoft\Internet Explorer\UrlSearchHooks,这个健值可用来劫持搜索引擎;

HKLM\Software\Microsoft\Internet Explorer\Toolbar,很多浏览器插件也会注册在这里;

HKCU\Software\Microsoft\Internet Explorer\Explorer Bars HKLM\Software\Microsoft\Internet Explorer\Explorer Bars HKCU\Software\Microsoft\Internet Explorer\Extensions HKLM\Software\Microsoft\Internet Explorer\Extensions 这四个键值也有流氓插件钻入的可能。

HKLM\SOFTWARE\Microsoft\Internet Explorer\Main和 HKCU\SOFTWARE\Microsoft\Internet Explorer\Main这两个子目录下面有大量的IE首页,搜索页面等敏感信息需要保护或者提示用户,这里就不仔细说了。

附录

感谢:
谢谢xfocus(www.xfocus.net),CVC(www.retcvc.com)和0x557的所有朋友,尤其是xyzreg(张翼)和vxk(张凌峰)。祝所有朋友心想事成。

作者简介:
白远方,联系方式:baiyuanfan@163.com,baiyuanfan@gmail.com。拥有一个工作室,"SteelKernel"。非常熟悉windows底层和内核,熟悉缓冲区溢出,木马病毒设计和防火墙等技术。欢迎朋友们联系。

Google

在Win32中管理虚拟内存--举例

Linux 64位C编程过程中的注意点

Web迅雷(xunlei)0day漏洞曝光

怎样学习C语言

中国DOS联盟批处理室经典帖子合集

熊猫烧香源代码

Uplink v1.54

Posted in 技术文章 | Tagged | Leave a comment

Ajax 让网页木马“悄悄的执行”

作者:空虚浪子心[X.G.C] http://cnxhacker.net
来源:IT168
原文地址:http://publish.it168.com/2007/0622/20070622010401.shtml

关于Ajax的执行,开发人员是这样想的"Ajax要做到,在用户浏览网页时应该感觉不到的它的执行(异步),不需要等待页面刷新就可以自动完成验证数据",比如用户名是否可以注册等。每当我想到"感觉不到的它的执行"这句话,就会联想到还有很多网络安全相关的东西(比如木马)都希望可以做到在用户感觉不到执行,或者可以在用户感觉不到的时候做些什么。

许多"研究网络安全的朋友"都应该感觉到,微软的操作系统已经很久没有像以前那样可以"ms05039.exe www.microsoft.com 7758"拿到SYSTEM权限了。于是大家都把目光放到了浏览器上,希望用户一旦浏览某个网页就能自动下载真正的木马服务端文件,然后在后台执行,这样的网页被成为"网页木马"。这样做有几点明显的好处:

1、不必想方设法突破层层防火墙,局域网内用户会自己通过"反弹连接"方式被轻易的控制。

2、如果这个有木马的网页在点击率高的网站上,会有很大的攻击面,只要浏览该页就可能中木马,比苦苦的等待扫描结果爽的多。

3、发送的电子邮件也可以附带这样的网页。

于是各种各样的IE漏洞出现了,从刚开始想办法在用户浏览网页时"56K猫的网速竟然要在后台下载300K左右的木马服务端",到各类"11k下载者" 的出现,大家唯一的目的就是想做到"让用户感觉不到的时候执行"。也是出于这个目的,我决定再研究下把Ajax融入网页木马,让木马"悄悄的进庄,打枪的不要"。

研究Ajax首先要研究"XmlHttp",来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。通常一个简单的Ajax是这样写的:

从第四步开始,浏览器就不再等待服务器返回的结果,而是继续处理"其他的事情",这就是"用户感觉不到的时候(异步执行)",等服务器返回结果时,才开始处理服务器返回的信息,所以这个时候最适合去服务器下载木马。关于异步执行,有个比较形象的比方,小李和女朋友上街,看到一家女士专卖店,小李不愿意进去,就在门口等,这个时候,他可以选择两种方式:1、在门口一直等着女朋友出来(同步执行),之后继续逛街;2、两个人事先商量好,然后闪人,等女朋友出来时会打电话叫他回来,之后继续逛街。

Xmlhttp对象有4个属性,用来描述服务器返回的不同数据类型,让JAVASCRIPT的变量接收。开始研究时,我有个思路: Javascript语言的变量是弱类型的,变量被定义后,初始化为什么类型,就是什么类型的变量。其中有一个属性"responseStream",返回"Ado Stream" 对象,该对象有个方法用来把返回的数据保存为文件,可以完成"下载木马"这个过程。于是写了个脚本,把返回的对象alert出来,竟然没有返回 object,而是发生错误,提示类型不支持。于是搜索"responseStream"的资料, MSDN里没有详细信息,使用".Net2005"编译器调试时看不到返回类型,code.google.com里也找不到相关代码(哪位大侠有相关可以操作responseStream的资料,麻烦给一份)。

破解网页木马加密篇:

为了继续研究,只好"探探虎穴",在QQ群里查看聊天记录,找QQ尾巴给出的网站,这样的网站通常都是被挂了马的。开启杀毒软件后打开网站,果然报有病毒:

停止杀毒软件的实时监控,使用EditPlus编辑网页源代码,代码内容被加密了。

基于javascript的网页加密都是对称的,可以还原回来。代码很凌乱,可见这段代码的作者不希望大家能看到。排版后看的清楚些,把重要的拿出来:

加密流程如下:

我们其实不用关心具体加密解密算法是什么,只关心如何解密就可以了,下面是解密的流程:

这样加密后,用户看到的就是加密后的页面,而浏览器会自动执行解密流程。破解这样的加密很简单,把源代码另存为htm文件,然后修改代码,解密的结果在一个文本域输出。

再次使用浏览器打开看到了解密后的真实代码在文本域里。因为这段代码会被杀毒软件查杀,所以不能给出文字的,排版后再次抓图:

这段代码就是真正的网页木马代码。

改良网页木马篇:

用户浏览该网页时,浏览器自动下载 Http://m2126.com/web/exe/data/1.exe ,保存到windows目录然后执行。杀毒软件会查杀它,是因为杀毒软件在这段代码中找到了"特征码",既然有源代码。我们也来找找,看看是它哪点写的太过分惹火了我的瑞星。找起来很简单,打开杀毒软件,删除某行,然后保存就好了,如果删除的地方不是特征码,杀毒软件会报告病毒。

这就是引起瑞星不满的代码,看名字就能想到,这段代码要执行下载的木马。分析这段代码有两点不好的地方:

1、在x.open()这里,最后一个参数是"0"(false),使用了非异步传输,就是说代码执行到某个地方需要等待服务器返回结果才能继续执行。很明显不符合"感觉不到的它的执行"原则。

2、因为代码想做到下载完成后立刻执行,所以刚下载了文件就去执行。

对于第一点,为什么没有用异步传输呢?因为代码并不是Ajax,没有判断服务器返回的状态,使用了"传统的网页木马的模式"。如果这里强行把"0"改成 "1",会造成木马还没有下载完成,就执行,结果当然出错。代码的作者可能没有想到 Ajax,所以只好使用了传统模式。然而现在网站都"web2.0"了,网页木马为什么不紧随潮流呢?对于第二点,考虑到杀毒软件猛如虎,我们要"敌进我退",不立刻执行木马,等用户下次重新启动电脑时再执行。要知道个人机器和服务器最大的差别就是,个人机器可能一天重新启动N次,服务器可能N年重新启动1次。

可能已经有些读者会想到修改注册表。那么恭喜你,答错了!因为杀毒软件会监控注册表,这样做不是虎口拔牙么?我们的原则是要"悄悄的"。推荐的想法是:在windows系统里有些特殊文件夹,启动系统时会自动执行目录下的文件,比如"C:\Documents and Settings\All Users\「开始」菜单\程序\启动"目录。这样,我们的思路就清晰了,首先使用Ajax技术默默的下载木马,然后悄悄的复制到这个目录里,如果你够狠还可以顺便弹出消息框"对不起!您的操作系统产生严重错误,为您带来不便,为了避免重要文件丢失,请立刻手动重新启动系统!"。
下面是我更改后的代码,使用了Ajax技术:

注意,在保存文件路径那里,路径最前面"\\..\\"是不能少,因为木马默认下载的位置是windows,或winnt。

在我的虚拟机(windows xp sp2)中访问这个页面,可以看到执行成功了。

注意启动项以及目标文件夹。大家可以根据自己的需求更改代码,本篇只是一个简单应用的例子,把一个网页木马使用Ajax技术进行了改良。推荐大家以后编写的网页木马,在下载木马的过程中,使用Ajax技术下载木马,这样的好处显而易见。

Ajax网页木马深入篇:

大家知道,网页木马的覆盖性很强,任何人浏览就可能中标,这是网页木马的一个大好处,但是有时候也会变成一个缺点,它缺乏了针对性。怎么叫针对性呢?这样的例子很多比如你只想让浏览这个网页的一部分人或这某个人中招,而别人毫无反应。听起来好神奇啊,大家都看网页,凭什么我中招而你没有,难道真的是人品问题?

在讨论技术前,先说说为什么要有针对性吧。在我们渗透企业内部网的时候,并不是企业内所有的员工都会很重视网络安全,常常就有那么几个人对于这方面什么都不懂。他们很可能防御相对比较弱,或补丁打得很晚,好,这次的目标就是让这帮人浏览木马,而其他人的计算机上是正常的。

首先要入侵这个企业的WEB网站,因为要使用网页木马,至少要有目标网站对于web页面写入和修改的权限。然后拿到这帮人的名单,其实你并不需要知道他们具体叫什么,只要知道他们在企业外部网站注册的用户名和邮箱就是了,具体方法可以参照"社会工程学"攻击。下面我们步入主题,怎么能唯独让这帮人浏览页面的时候执行呢?

大多数网站都有让用户登录的地方,邮箱登录、论坛登录等,在用户输入用户名后,进行判断,如果他的姓名在我们的黑名单里,就把木马丢给他。
下面是我更改后的代码:AdvanceAjax.htm

代码:go.js(网页木马)页面

代码的流程对比如下:

代码可以嵌入到企业网站的论坛,电子邮箱等登录页面。这样做的明显好处是:即使部分用户抱怨说有问题,网络安全工程师自己打开时仍然发现不了任何异常,或许会认为客户又在无故抱怨。

Ajax网页木马扩展篇(纯理论)

随着网页木马越来越隐形化,大家挂的马越来越多,慢慢的,形成了一定的规模,就会造成一些管理上的问题。因为即使一个木马再好,一旦使用的多了,被查杀的可能性仍然会大大的增加。微软的IE 漏洞仍然在继续增加,有时候想把自己所有的网页木马(不同的网站)全都换一下,还要一个一个的找自己的后门,一个一个的改。这样做,很不符合程序的可扩展性,一个好的程序,应该做到在不更改或较少的更改已经写好的代码,就可以增加扩展功能。所以我们的代码仍然需要改进。

需要说明下,细心的读者应该注意到,文章给出的代码虽然能够使用,但是成功率很低,因为我故意使用了一个很老版本的网页木马在不断的加工,最终目的还是为了让大家理解web安全的重要性。而本篇的代码一旦给出,会有很强的攻击性,所以为了保守起见,只是提供一下思路。
让用户打开网页时,并不是把木马嵌入到当前网页里,而是把用户的请求交给另一个网站的页面处理。从另一个网站的页面返回真正的网页木马,然后执行,最后只要把这个页面管理起来。Javascript只能访问本域下的资源,而不能跨域访问。也就是说,www.microsoft.com站点中的 Javascript只能访问www.microsoft.com站点下的资源,而不能跨域访问www.sun.com站点中的资源。解决的方式是使用代理,Ajax访问有本域下的服务端脚本文件(asp、jsp、php等),再由服务端脚本文件访问其他站点下的资源,然后返回给Ajax处理。详细解决方案参照文章《Use a Web Proxy for Cross-Domain XMLHttpRequest Calls》地址在:" http://developer.yahoo.com/javascript/howto-proxy.html "。

防御篇

防御这段代码其实很简单,我的虚拟机的系统没有打相应的补丁,安装的系统是默认的番茄花园某个版本的系统。本机已经打了IE补丁(别问我具体是什么补丁,反正都应该打),打开这个页面的结果会是:

这样就可以很好的预防"这段代码"。注意,我要强调一下只是可以预防这段代码而已。IE漏洞层出不穷,经常在微软没有发布补丁之前出现的漏洞,所以大家虽然打了补丁,安装了杀毒软件,也并不是万无一失的。

看起来使用了Ajax的网页木马花样百出,想尽办法在用户和杀毒软件之间玩捉迷藏,我们有没有什么办法可以一劳永逸的防止网页木马呢?曾经有一句话叫做 "只有拔下插头的计算机才是安全的",而凯文•米特尼克回答说:"事实上你可以说服用户把插头接上",由此可见没有绝对的安全。而我们能做的是尽可能的安全(注意不是尽可能的变半夜凉初透态)。

建议的防御思路是:首先假设系统底层已经被黑客入侵,然后采取相应一些对策,再假设只是web服务被入侵,黑客仅仅具备web服务的控制权限,然后采取一些相应对策,就这样层层假设,我们的防御体系就会慢慢健全。

按照以上思路,网页木马的防御应该是:假设我们已经浏览了网页木马,浏览器正在后台默默的下载木马服务端,下载完成后就要把木马复制到启动项,或者就要立刻执行。好的,想办法拦截,不允许复制和执行。

1、首先修改启动项目录的权限为管理员才能对文件进行写操作。

2、在桌面上建立浏览器的快捷方式,在快捷方式上点鼠标右键,选择属性>高级>勾选"以其他身份运行"。

3、建立一个新的用户,用户名为"q",密码为"q",默认加入"users用户组"。因为这是"以其他身份运行"后,再次打开会提示输入用户名密码,所以简单些好输入。

4、修改安全策略,不允许新建的用户登录系统。

这样,每次我们打开这个浏览器快捷方式时,是以users组的身份执行的,而木马是通过浏览器执行的,所以木马执行的时候也只有users组权限。没有系统权限,木马还能做什么?系统会立刻提示无权限执行,然后可怜的木马就此"失蹄"了。这样做的另一好处是可以阻止流氓软件自动安装,凡是要给浏览器下毒的,一律坑杀。坏处是不能立刻自己安装想要使用的插件,如果必须要安装一些可信任的插件,可以从"开始"菜单里找到浏览器重新打开页面安装。
熊猫烧香源代码

中国DOS联盟批处理室经典帖子合集

Web迅雷(xunlei)0day漏洞曝光

Linux 64位C编程过程中的注意点

在Win32中管理虚拟内存--举例

正则表达式

Continue reading

Posted in 技术文章 | Leave a comment

让WordPress模板适合中文显示

我要说的其实很简单:请注意你的Blog中文字体显示效果。WordPress模板数量绝对是所有Blog程序里最庞大的一个,但是大部分模板都是老外所作,这里就有一个很重要的问题:中文。

使用IE作为浏览器看到的字体会比这个大,但是使用Firefox/Opera浏览器并且没有设定Minimum font size = 12的朋友就会得到这样一个效果。这是因为大部分模板是基于英语或相关语系来做,而模板设定的默认字体大小并不适合中文显示造成的。至于为什么IE浏览会稍好的原因我不在本篇解释了,有兴趣的可以看看这个讨论

修正这个也很简单,只要修改css文件中有关font-size的部分,把字体调整到12px以上就可以了。顺便再次介绍修改用的超强组合:Firefox + Web Developer,用这个组合可以马上看到修改后的效果而不用直接修改源代码。

除了字体大小外还有一个很讨厌的问题,仔细看会发现有时第二行的英文间隔相比第一行来说有些奇怪,这是因为大部分模板喜欢用justify这种排列方式。justify会自动调整字间距来保证每行的左右对齐,但这个效果仅仅对于字母类型的文字有效,当它被作用到一篇中英文混排的文章时,效果实在差强人意,更有甚者常常会出现提早换行这样的结果。修正起来也比较简单,编辑你的css文件中有关text-align: justify的条目修改为text-align: left。这样的对齐方式相比之下会更适合中文阅读。

另一篇文章:

body部分font-size定义为12px或者14px(一般是这两个大小,当然你要13px也没问题,不嫌大的话16px也ok),但是就只有这里用px­定义,其他任何地方的字号或者行间距或者缩进等等都用em或者百分比来定义比较好。这样,就有了一个大小的基准。

比如,行间距line-height定义为1.7em或者170%比较合适(就是说如果你前面定义的是12px的话,这个行间距就是1.7 X 12px=20px左右,知道了吧。)

再比如,sidebar里面的标题h2的大小,就可以定义为1.2em,就会是一般的字的1.2倍大了。

这样定义最大的好处就是修改整个页面的字体大小时,只需要改一个就行了。。

英文的主题基本上也就是像这样定义的,但是他们喜欢把作为基准的那个大小定义成small啊 normal啊什么的,导致中文显示在不同的地方出现问题。要我说,还是用px严格定死了好。

Posted in 心情随笔 | 1 Comment

更换WordPress主题后必须做的10件事

来自Instigator BlogBen Yoskovitz写的这篇文章其实不只针对WP用户,对所有爱摆弄的blogger都是友善的指导。

WordPress令更换主题设计非常简单,但是更换之后你仍需注意这些重要步骤:

1,侧栏(sidebar)要重写。多数人对他们的侧栏做过很多变动,添加文字、广告、连接、widget等等。如果你使用的是支持widget的WP主题就没关系(即使主题更改widget仍然会保留)但如果你是手动更改的则需要重新来过。

激活新主题前,保存你侧栏的所有代码(复制粘贴到某处OK)。切换主题时,编辑侧栏文件并保存。

2,重新加入统计跟踪代码。多数人用一些blog统计跟踪工具(如Google Analytics、103bees等)。这通常在加到header或者footer的一串代码。更换WP主题时因为header和footer会被覆盖,你需要重新添加。否则统计不再生效。添加之后确认统计是否正常工作。

如果你在用Google Webmasters Tools也一样。Google Webmasters Tools需要你验证站点所属。可以通过上传一个文件(和跟更改WP主题无关)或者添加元标签(meta tag)代码到header文件。若是后者,请确认你已经将此代码正确添加。

3,检查所需要的插件。你也许不必再使用先前的某些插件,有些或者跟你的新主题不配或已经多余。比如作者曾使用一个Optimal Title插件,这对SEO是很好的,但是之后发现新的主题已经自动将文章标题前置了,因为该插件不再需要。

也会有些插件你不再想用,是大扫除的时候啦。

4,验证插件是否工作。不需要更改模板文件就生效的插件应该是OK,不过很多就不是了。你需要在模板中添加相应代码,比如Related Entries插件。

某些插件可能会因为新的CSS而变得外形奇怪,这样你也必须修改CSS文件。

5,更新你的广告设计和颜色。如果你在用Google AdSense、Text-Link-Ads或其他任何形式的广告,注意新旧广告因为主题/颜色变动可能带来的不完美。如用Google AdSense 的话通过AdSense Deluxe就可简单更改WP的颜色。Text-Link-Ads的话你也可以编辑WP的插件来实现。

6,确认RSS feed订阅正常工作。相当重要的哦。

7,测试所有的二级特性。当一开始选择一个主题时你没有发现它的全部功能特性,包括页面、搜索、分类、归档。现在来仔细看一看或许会让你大吃一惊。比如,换新主题后我试了下搜索,发现搜索结果里没有包含文章摘要,那我就要改一改了。

8,用不同浏览器测试。多数人会忘记用多种浏览器测试,但这非常关键。如果你是用PC,可以很容易在Firefox和IE里测试。在Mac上可以用Firefox和Safari。

9,细心更改。你也许没有花很多时间玩你的新WP主题。所以当你开始改动时,慢慢来。做一些小改动,在多个浏览器里测试看看结果。要动大手术之前你该对主题有深入了解。

10,在你在blog上列出更改。告诉人们你更改了blog设计。收集反馈,从各种不同配置、分辨率、浏览器、屏幕尺寸等等的用户中了解你的主题究竟如何。提醒RSS读者也来参与一下。

原文:10 Things You Must Do When Changing WordPress Themes
翻译:孙波(Flavien)

Posted in 心情随笔 | Leave a comment

全球15个顶级技术类博客

 中文翻译:IT168网

  英文原文:Top 15 geek blog sites

  在互联网世界当中,博客网站的种类是多种多样的。它们中的一些旨在教导、帮助人们交流协作、激发灵感,并拓展我们的思维空间。而另一些博客则侧重于激发我们的情感,让我们感到愤怒,或是让我们开怀大笑。《电脑世界(Computerworld)》网站的编辑们这些优秀博客网站搜集整理在了一起,为我们提供了一份最受他们所钟爱的博客网站的列表。最后,我们根据这些博客自身的信息广度、新闻价值、网站设计、更新频率以及娱乐价值,将这份50多位候选人的大名单做了进一步的缩减,最终得到了这份15个世界最顶级的技术类博客网站排行榜。

  不错,这份排名的确包含了很大的主观成分,但是我们认为它是有史以来发表过的此类博客网站的最棒的排行榜之一。这份名单所涵盖的范围非常广泛:从严肃的技术性新闻,到对电脑游戏测评和评论,再到新潮消费者电子产品介绍。我们同时也在本份名单的最后增加了一些"荣誉提名",因为这次排名的竞争是如此的激烈,让我们感到很难取舍。

  当然了,肯定不会是每一个人都赞同我们的观点。如果你认为有某个博客网站非常的优秀,而又没有出现在我们的"前15名排行榜"中的话,请在本文后面的评论当中留言与我们分享。

  1) 生活骇客(Lifehacker)

  http://www.lifehacker.com

  生活骇客(Lifehacker)的座右铭表达了它的全部理念:"不要为技术而生活,要为生活而关注技术!"这个博客提供了有关于各方各面的"时间节省"小贴士,从Firefox网络浏览器的快捷操作,到来自"时间管理教"忠实信徒的谆谆教诲。

  2) IT工具箱博客(IT Toolbox Blogs)

  http://blogs.ittoolbox.com

  IT工具箱博客(IT Toolbox Blogs)有着一大群"战斗在第一线"的IT专家们讨论有关于技术和IT管理的话题。它拥有一系列专业性的博客在处理跟IT安全、数据库、项目管理和其它等等相关的问题。这是一个包罗万象的网站。

  3) 硅谷闲话(Valleywag)

  http://valleywag.com

  "众口铄金,积毁销骨"。硅谷闲话(Valleywag)是专门为那些相信"在技术行业中的生死在很大程度上都取决于硅谷周围所传播的闲话"的人准备的。对于那些热衷于制造、听闻和传播硅谷谣言的那些人来说,这个网站凭借着其卓越的"专业素养"而让人薄雾浓云愁永昼大为惊叹。

  4) Kotaku

  http://kotaku.com

  Kotaku是电脑游戏爱好者的"加油站"。它拥有跟电脑游戏有关的一切,从对游戏的测评,到相关的讨论和扯淡,再到作弊技巧。这里有你所需要的一切,比如某款游戏到哪里去购买,以及怎样进行玩耍。

  5) 威胁空间(Danger Room)

  http://blog.wired.com/defense

  《连线(Wired)》杂志所推出的军事和防卫博客网站,它向读者介绍了这个世界上最新、最酷、最令人震撼的军事技术--更不用提那些丑闻、争论和其它类型的军事新闻。网站中还提供了许多视频和图片。

  6) 小发明(Gizmodo)

  http://gizmodo.com

  小发明(Gizmodo)网站专门为读者挖掘全世界最新、最酷、或是最稀奇古怪的技术发明--从高清晰电视、到咖啡机、到弹力腰带,再到USB驱动器。是的,他们同样也发布那些严肃的技术性新闻。

  7) O'Reilly 雷达(O'Reilly Radar)

  http://radar.oreilly.com

  这是你能够阅读到Tim O'Reilly(著名的O'Reilly出版公司的创始人)和其它人讨论有关于网络、编程、开放源代码运动、知识产权、政策、Web 2.0和其它前沿科技的地方。

   8) 技术丑闻(Techdirt)

  http://www.techdirt.com

  技术丑闻(Techdirt)是一个话题中心,以在当前的互联网和电脑领域的热门事件上引发激烈争论而闻名。流言蜚语是它的所爱!简洁是它的特点!

  9) Groklaw

  http://www.groklaw.net

  Groklaw网站的原本存在目的是支持SCO公司对IBM和Novell公司所发起的漫长的专利侵权诉讼,但是不知道什么时候,这里的讨论转向了其它方面,话题包括了技术、知识产权以及政府法规。

  10) 改造一整天(Hack a Day)

  http://www.hackaday.com

  想要学习怎样为一个廉价的Linux路由器添加一个USB设备吗?想要制作一个蛇形机器人吗?或是将自己的XBox 360游戏机改造成一台笔记本?"改造一整天(Hack a Day)"上提供了这些地下室项目,以及其它更多有趣的项目。这个网站是为那些真正有一定技术素养,喜欢自己动手改造技术产品的玩家所准备的。但与此同时,你也可以在这里发现很多乐趣,说不定还会从中开发出一项新的爱好。

  11)小玩意儿(Engadget)

  http://www.engadget.com

  就像可口可乐和百事可乐的关系一样,小玩意儿(Engadget)和小发明(Gizmodo)就像是一对孪生兄弟。它也是专注于技术产品相关的介绍、评论,有时候也会有充满激情的演讲和辩论。小玩意儿(Engadget)上充满了摄制精美的产品图片,而它网站的编辑们还有着广泛的内部渠道,可以在新潮的技术产品还处于先期或早期发布阶段,就可以一睹它们的芳容。同样的,小玩意儿(Engadget)上面也会刊登一些真正非常有趣的手工制作的玩意儿。但是,我们更喜欢小发明(Gizmodo)一点。

  12) Feedster

  www.feedster.com/feedpapers/Technology

  一切都是那么的水到渠成。这个网站汇集了各种各样的博客站点,包括技术类、体育类、名人八卦、美食、个人体验等等等等--只要你能想到的,它都拥有。同时,它还提高了卓越的站内搜索功能,以及一个非常酷的RSS新闻阅读软件。它在技术新闻里面加入了非常出色的幽默感。这真是一个各方面都很优秀的网站。

  13) 永远的骇客(Forever Geek)

  http://forevergeek.com

  永远的骇客(Forever Geek)是一个非常棒的网站,它有无数的博客文章,覆盖了多种多样的话题,从技术,到大众新闻,到好莱坞电影,再到电脑游戏测评。这绝对是一个骇客的天堂。假如你想要了解即将上映的好莱坞巨片《变形金刚》的最新消息,或是阅读一篇有关于Photoshop CS3软件的测评,这就是你应该去的地方。

  14)粗鲁的文字(Rough Type)

  www.roughtype.com

  Nick Carr(笔名"Does IT Matter?")撰写的一个思想锐利的博客,专门讨论与技术相关的各种各样的话题和趋势。他的文章文笔优美,让人阅读起来津津有味,但是同时也会常常激烈那些被批评的公司、人物、技术和政策。

  15) 自助餐(Smorgasbord)

  www.smorgasbord.net

  作为一个为那些喜爱数码产品和电脑游戏的骇客们所专门打造的站点,这个网站同样也提供最新的有关于政治和名人的新闻。这种娱乐价值和技术新闻的战略组合,让自助餐(Smorgasbord)跻身于最优秀者的行列。

  荣誉提名:

  1) 苹果(Apple)非官方博客 (TUAW)

  www.tuaw.com

  TUAW集结了许多独立的博客--这些独立的博客虽然和苹果公司官方没有正式的关系,但是这并不意味着他们的信息不充分、意见没有影响力。这是一个了解苹果公司相关新闻的最好来源。它没有跻身前15名的唯一原因是它太过于专注于一个单一话题。

  2) Elliot Back 的博客(Elliot Back's blog)

  http://elliottback.com/wp

  作为自封的"计算机科学家",Elliot对于每一件自己所关注的事情大放厥词,从为什么XML标准很糟,到泰坦尼克号的旅客名单,再到对好莱坞巨片《斯巴达300勇士》的影评。这个网站的内容多种多样,但是安排巧妙。此外,他还会提供一些非常棒的小贴士,比如如何增进系统的性能,以及屏蔽垃圾邮件。

  3) Ed Foster 的牢骚录(Ed Foster's Gripelog)

  www.gripe2ed.com/scoop

  时下有一类新的博客网站涌现了出来,它们专门抨击和曝光那些侵害消费者权益的公司和产品,诸如数码产品恶劣的售后服务、粗糙的产品外观或是其他诸如此类的一些问题,但是Ed Foster可谓是这一行的开山鼻祖。看看他最新所关注的一些话题:有缺陷的DRM系统、plasma品牌电视机的质保陷阱,以及糟糕的移动电话服务质量。

  4) Gadgetell

  www.gadgetell.com

  假如你想要了解最新的数码产品、电玩游戏新闻,以及其他相关的一些消息,这是一个很棒的网站。

  5) 4sysops

  http://4sysops.com

  它为Windows系统的管理员们提供了非常优秀的小提示和操作教程。

Continue reading

Posted in 心情随笔 | 2 Comments

云中剑客's Blog 开站了

欢迎来到 WordPress。这是您的第一篇文章。您可以修改或删除它,然后开始撰写您自己的 Blog!

Posted in 未分类 | 1 Comment