Comments
Description
Transcript
未知のバイナリプログラムが用いているデータ構造の推定
ະͷόΠφϦϓϩάϥϜ͕༻͍͍ͯΔσʔλߏͷਪఆ େ ࢁ ߂ ܙ † ཾ† ຊͰڀݚɺϚϧΣΞʹද͞ΕΔະͷόΠφϦϓϩάϥϜ͕෦Ͱ༻͍͍ͯΔσʔλߏΛ ਪఆ͢ΔγεςϜΛఏҊ͢ΔɻຊγεςϜɺະͷϓϩάϥϜΛ͕ͳ͠ࢹΒಈ࡞ͤ͞ɺ༷ʑͳλ ΠϛϯάͰͦͷϓϩάϥϜΛఀࢭͤͯ͞ελοΫώʔϓͷ༰Λऔಘ͢Δɻͦͷ༰ͷղੳʹΑΓɺ ͦͷϓϩάϥϜ͕༻͍͍ͯΔσʔλߏͷछྨɺσʔλʹؔͯ͠ৗʹཱ͢Δੑ࣭Λਪఆ͢Δɻ Prediction of Data Structures Used in Unknown Binaries Yoshihiro Oyama † and Yoshitatsu Kawabata† 1. ͡ Ί ʹ ϚϧΣΞͷڴҖґવਂࠁͰ͋ΔɻϚϧΣΞର ༻͍͍ͯΔσʔλߏͷछྨɺσʔλʹؔͯ͠ৗʹ ཱ͢Δੑ࣭Λਪఆ͢Δɻͨͱ͑ɺਪఆ݁Ռͱͯ͠ ʮΞυϨε 0x08048374 ͔Β࢝·Δؔͷ 3 ݸͷہ ࡦʹ͓͍ͯɺϚϧΣΞͷಈ࡞ͷղੳ͕ɺඃͷ ॴมɺώʔϓ্ͷจࣈྻΛࢦ͢ϙΠϯλͰ͋Δʯ ੳ֦ࢄͷࢭʹෆՄܽͰ͋ΔɻϚϧΣΞͷղੳʹ ͱ͔ʮΞυϨε 0x08052ca8 ʹ֨ೲ͞ΕΔඞͣ 0 ɺίʔυྻΛղੳ͢Δ੩తղੳͱɺϚϧΣΞΛ࣮ ͔Β 31 ·Ͱͷൣғʹ͋Δʯͱ͍ͬͨใΛग़ྗͤ͞ ߦͯ͠ಈ࡞Λղੳ͢Δಈతղੳ͕͋Δɻ୯७ͳϚϧ Δ͜ͱΛݕࡏݱ౼͍ͯ͠Δɻ·ͨɺ༻͍͍ͯΔσʔλ ΣΞʹରͯ͠ɺ੩తղੳ͋Δఔ༗ޮͰ͋Δɻ ߏ͕ϦετπϦʔͰ͋ΔͳͲͷใΛਪఆ͢Δ͜ ͔͠͠ɺෳࡶͳϚϧΣΞಡԽ͞ΕͨϚϧΣΞ ͱݕ౼͍ͯ͠Δɻ ʹରͯ͠ɺղੳ͕ࣦഊͨ͠Γɺղੳʹେ͖ͳख͕ؒ ͔͔ΔͳͲɺ੩తղੳ͕༗ޮͰͳ͍͜ͱଟ͍ɻͦͷ Α͏ͳϚϧΣΞͷղੳʹಈతղੳ͕༗ޮͰ͋Δɻ ैདྷͷಈతղੳख๏ͷଟ͘ɺͼݺग़͞ΕΔ OS API 2. ؔ ࿈ ڀ ݚ Cozzie ΒʹΑΔ Laika1) ɺϓϩηεͷϝϞϦΠ ϝʔδΛೖྗͱͯ͠ɺͦͷϓϩηε͕༻͍͍ͯΔσʔ ͷྻɺಡԽલͷίʔυΛநग़͢Δɻ͔͠͠ɺ೦ λߏΛਪఆ͢ΔγεςϜͰ͋Δɻຊڀݚͷํ๏ ͳ͕ΒɺͦΕΒͷख๏ͰಘΒΕΔใɺOS ͱΞϓ Laika ͷํ๏Λϕʔεʹ͍ͯ͠Δɻͨͩ͠ຊͰڀݚɺ Ϧέʔγϣϯͷؒͷք໘ͷڍಈͷใɺίʔυྻͷ ҎԼͷ 2 ʹΑΓɺLaika ΑΓߴ͍ਫ਼Ͱਪఆ͢Δ ใʹݶΒΕΔɻͦͷ݁ՌɺϚϧΣΞ͕෦ͰͲ͏ ͜ͱΛࢦ͍ͯ͠ΔɻୈҰʹɺෳͷϝϞϦΠϝʔδ ͍͏ΞϧΰϦζϜσʔλߏΛ༻͍͍ͯΔ͔ʹ͍ͭ Λར༻͢ΔɻఏҊγεςϜͰɺະͷϓϩάϥϜΛ ͯଟ͘ͷใ͕ಘΒΕͣɺ߈ܸख๏ͷཧղʹख͕ؒ ࣮ߦ͍ͯ͠ΔϓϩηεΛෳͷλΠϛϯάͰఀࢭͤ͞ɺ ͔͔Δɻ ଟͷϝϞϦΠϝʔδΛऔಘͯ͠ղੳʹ༻͍Δɻୈೋ ຊͰڀݚɺϚϧΣΞʹද͞ΕΔະͷόΠφ ʹɺγεςϜίʔϧϥΠϒϥϦؔͷҾͷ༷ʹ ϦϓϩάϥϜ͕෦Ͱ༻͍͍ͯΔσʔλߏΛਪఆ͢ ؔ͢ΔࣝΛར༻͢Δɻྫ͑͋Δ͕ stat γες ΔγεςϜΛఏҊ͢ΔɻຊγεςϜɺະͷϓϩά ϜίʔϧͷୈೋҾʹ͞Ε͍ͯͨΒɺͦͷͷΞυ ϥϜΛ͕ͳ͠ࢹΒಈ࡞ͤ͞ɺ༷ʑͳλΠϛϯάͰͦ Ϩε͔Β࢝·ΔϝϞϦྖҬߏମΛ֨ೲ͢ΔͨΊʹ ͷϓϩάϥϜΛఀࢭͤͯ͞ελοΫώʔϓͷ༰Λ ༻͍ΒΕ͍ͯΔͱਪଌ͢Δɻ औಘ͢Δɻͦͷ༰ͷղੳʹΑΓɺͦͷϓϩάϥϜ͕ † ిؾ௨৴େֶ The University of Electro-Communications 第51回プログラミング シンポジウム 2010.1 3. ఏҊγεςϜ ຊγεςϜ Linux/IA-32 ্ʹ࣮͞ΕɺLinux/IA- 32 ༻όΠφϦϓϩάϥϜΛղੳରͱ͢Δɻղੳର 165 όΠφϦʹγϯϘϧใ·ؚΕ͍ͯͳ͍ͱ͢Δɻ ͕ࢦ͢σʔλߏΛਪఆ͢Δɻ·ͣɺϙΠϯλͷઌ ະͷϓϩάϥϜΛ࣮ߦ͢ΔϓϩηεʢΞϓϦέʔ ͕ɺNUL จࣈͰऴΘΔ ASCII จࣈྻͰ͋Δ߹ʹ γϣϯϓϩηεʣ1 ͭʹ͖ͭɺͦΕΛ͢ࢹΔͨΊͷϓ ɺʮจࣈྻΛࢦ͢ʯͱ͍͏ใΛɺͦͷϙΠϯλͷ ϩηεʢϞχλϓϩηεʣΛ 1 ͭ࡞ΔɻϞχλϓϩη ʮछྨʯʹՃ͢Δɻͦ͏Ͱͳ͍߹ʹɺϙΠϯλ εΞϓϦέʔγϣϯϓϩηεΛɺશͯͷؔͷઌ಄ ͕ࢦ͢σʔλߏ͕ͲͷϝϞϦΞυϨε·Ͱଓ͘ͷ͔ ͱඌɺ͓ΑͼɺશͯͷγεςϜίʔϧͷͼݺग़͠ͱ ΛҎԼͷํ๏Ͱਪఆ͢Δɻ·ͣɺͦͷ࣌ͰͷϝϞϦ ෮ؼͷλΠϛϯάͰఀࢭͤ͞ΔɻఀࢭޙɺΞϓϦέʔ Πϝʔδͷத͔ΒɺϙΠϯλͱਪఆ͞ΕͨΛશͯू γϣϓϩηεͷϝϞϦΠϝʔδɺશϨδελͷɺϑΝ ΊΔɻͦΕΒͷϙΠϯλͷͷΞυϨεશ͔ͯΒผݸ Πϧ/proc/pid /maps ͷ༰Λऔಘ͠ɺอଘ͢Δɻ͜ ͷσʔλߏ͕࢝·Δͱਪఆ͢Δɻͦͯ͠ɺ֤σʔλ ͷϑΝΠϧʹɺϓϩηε൪߸ pid ͷϓϩηε͕͏ ߏɺ࣍ͷσʔλߏ͕࢝·ΔΞυϨεͷલɺ ϝϞϦͷͲͷൣғ͕ελοΫώʔϓͳͲͰ͋Δ͔ʹ ελοΫͷϑϨʔϜؒڥք·Ͱଓ͘ͱਪఆ͢Δɻ ͍ͭͯͷใ͕ॻ͔Ε͍ͯΔɻؔͷઌ಄ͱඌͰͷ γεςϜίʔϧͷͼݺग़͠લޙͷϝϞϦΠϝʔδͷ ఀࢭɺίʔυྖҬͷϒϨʔΫϙΠϯτͷૠೖʹΑ ղੳͰɺγεςϜίʔϧͷҾฦΓͱͯ͠ Γ࣮͠ݱɺγεςϜίʔϧͰͷఀࢭ ptrace γες ͞Ε͍ͯΔΛௐΔɻͦͷγεςϜίʔϧ͕ϙΠϯ ϜίʔϧʹΑΓ࣮͢ݱΔɻ λΛड͚͢ͷͰ͋Δ߹ʹɺड͚͞Ε͍ͯΔ ຊγεςϜɺอଘ͞ΕͨϝϞϦΠϝʔδͳͲ͔Βɺ ϙΠϯλͷͷʮछྨʯʹɺγεςϜίʔϧͷ༷͔ ͦͷϓϩάϥϜ͕Ͳ͏ϝϞϦΛར༻͢Δ͔Λਪఆ͢Δɻ Β͔ΔใΛՃ͑Δʢʮ16 όΠτͷߏମΛࢦ͢ʯ ۩ମతʹɺώʔϓྖҬͱ੩తσʔλྖҬͷ֤ΞυϨ ͳͲʣɻ εɺ͓Αͼɺ֤ؔͷελοΫϑϨʔϜͷ֤ॴʹ ͜ΕΒͷॲཧͷޙɺϦετπϦʔͱ͍ͬͨɺϙΠ ֨ೲ͞ΕΔσʔλͷʮछྨʯΛਪఆ͢Δɻʮछྨʯͱ ϯλͷΈ߹ΘͤʹΑͬͯߏங͞ΕΔσʔλߏΛݕ ɺϙΠϯλͳͲͷɺϓϩάϥϜͰͷ༻్ʹ ग़͢Δɻݕग़ॲཧɺϙΠϯλͱਪఆ͞Ε͕ͨσʔ Ԡͯ͡ྨ͞Εͨू߹ͷ֤ʑʹ༩͞ΕΔใͰ͋ λߏͷதʹ·ؚΕΔ߹ʹɺͦͷϙΠϯλΛ࠶ؼత Δɻྫ͑ɺ͋Δ͕ελοΫྖҬώʔϓྖҬΛࢦ ʹ୧Δ͜ͱʹΑΓ࣮͞ݱΕΔɻ ͢ϙΠϯλͱͯ͠ղऍͰ͖Δʢͦͷ͕ͦΕΒͷྖҬ ͷΞυϨεൣғʹ͋Δʣ߹ʹɺຊγεςϜͦ ͷͷʮछྨʯΛɺʮελοΫྖҬͷϙΠϯλʯ 4. ݱঢ়ͱࠓޙͷ՝ զʑఏҊγεςϜΛ࣮ࡏݱதͰ͋Δɻ࣮͕ ʮώʔϓྖҬͷϙΠϯλʯͰ͋Δͱਪఆ͢Δɻͳ͓ɺ ྃͨ͠Βɺ༷ʑͳΞϓϦέʔγϣϯΛରʹɺσʔλ વͳ͕Βɺେ͖͍ΛϙΠϯλͰ͋Δͱղऍͯ͠ ߏΛਖ਼͘͠ਪఆͰ͖Δ͔Ͳ͏͔ΛධՁ͢Δɻ·ͨɺ ͠·͍ɺਪఆΛޡΔՄೳੑ͋Δɻ σʔλͷʹؔͯ͠ৗʹཱ͢Δੑ࣭Λਪఆ͢Δػೳ ղੳࡾஈ֊ͰਐΊΔɻୈҰஈ֊Ͱɺฏจͷίʔ ͷՃਐΊΔɻ͜ͷػೳ Daikon2) ͷख๏Λࢀߟ υྻ͕ϝϞϦྖҬ্ʹࡌ͍ͬͯΔϝϞϦΠϝʔδΛҰ ʹͯ͠ઃ͢ܭΔ༧ఆͰ͋Δɻ͞ΒʹɺWindows ͷ ͭબͼɺͦͷίʔυྻΛٯΞηϯϒϧͯ͠ call ໋ྩΛ Ҡ২ݕ౼͍͖͍ͯͨ͠ɻ நग़͢Δɻͦͯ͠ call ໋ྩͷΦϖϥϯυʹ·ؚΕΔ ίʔυΞυϨεͷू߹Λʹݩɺ֤ؔͷίʔυ͕ஔ͔ ΕͨϝϞϦൣғΛਪఆ͢Δɻ ୈೋஈ֊Ͱɺ֤ϝϞϦΠϝʔδʹରͯ͠ҎԼͷॲ ཧΛߦ͏ɻ·ͣɺελοΫΛఈʹ͚ͯ୧Γͳ͕Βɺ ֤ϑϨʔϜʹ֨ೲ͞Ε͍ͯΔΛऔಘ͢Δɻͳ͓ɺ֤ ϑϨʔϜ͕ͲͷؔͷͨΊͷͷ͔ʹ͍ͭͯɺୈҰ ஈ֊ͰٻΊͨϝϞϦൣғใͱɺ֤ϑϨʔϜʹ֨ೲ͞ Ε͍ͯΔϦλʔϯΞυϨεΛর߹ͯ͠ௐΔɻ࣍ʹɺ ੩తσʔλྖҬώʔϓྖҬʹอଘ͞Ε͍ͯΔΛ͢ ͯऔಘ͢Δɻऔಘ֤ͨ͠ʑͷʹ͍ͭͯɺͦͷ͕ ώʔϓͳͲΛࢦ͍ͯ͠Δ͔Ͳ͏͔ʹै͍ɺͦͷʹׂ ΓͯΔʮछྨʯΛܾఆ͢Δɻ ँࣙ ຊڀݚͷҰ෦૯লઓུతใ௨৴ڀݚ։ ൃਪਐ੍ʢSCOPEʣͷࢧԉΛड͚ͯߦΘΕͨɻ ࢀ ߟ จ ݙ 1) Anthony Cozzie, Frank Stratton, Hui Xue, and Samuel T. King. Digging For Data Structures. In Proceedings of the 8th USENIX Symposium on Operating Systems Design and Implementation, 2008. 2) Michael D. Ernst, Jeff H. Perkins, Philip J. Guo, Stephen McCamant, Carlos Pacheco, Matthew S. Tschantz, and Chen Xiao. The Daikon system for dynamic detection of likely invariants. Science of Computer Programming, 69(1–3):35–45, 2007. ୈࡾஈ֊Ͱɺୈೋஈ֊ͰϙΠϯλͱਪఆ͞Ε֤ͨ 166 第51回プログラミング シンポジウム 2010.1