...

未知のバイナリプログラムが用いているデータ構造の推定

by user

on
Category: Documents
5

views

Report

Comments

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
Fly UP