Upgrade to Pro — share decks privately, control downloads, hide ads and more …

golt.pdf

Avatar for yu fujioka yu fujioka
June 24, 2019
240

 golt.pdf

Avatar for yu fujioka

yu fujioka

June 24, 2019
Tweet

Transcript

  1. yu fujioka : CypherTec Inc. Go ͷόΠφϦΛோΊΔ ͦͯ͠όΠφϦϑΝΠϧ͔Β Go ΛֶͿ

    HPCVJME HPQDMOUBC  MEqBHT > go version go version go1.12.5 darwin/amd64
  2. whoami yu fujioka: ॴଐɿCypherTec Inc. ɾSoftware Engineer ݉ Security Engineer

    ɾC++ Ͱͷ੡඼։ൃ΍ηΩϡϦςΟ਍அۀ຿Λ୲౰ ɾGoɺTypeScript ͳͲΛษڧத ɾస৬Λػʹɺ2015೥ʹ౦ژ͔Βಙౡݝ΁Ҿͬӽ͠ ɾαςϥΠτΦϑΟεͷಋೖΛߟ͍͑ͯΔاۀͷํ ɾαςϥΠτΦϑΟεʹڵຯͷ͋ΔΤϯδχΞͷํ ɹ͓ؾܰʹ͓੠ֻ͚͍ͩ͘͞ɻ
  3. Let's Build Go ͸ΫϩείϯύΠϧ͕ՄೳͰ͋ΓɺϏϧυ؀ڥʹΑͬͯੜ੒͞ΕΔόΠφϦ͕ େ͖͘ҟͳΓ·͢ɻ ࡞ۀ୺຤͸ Mac Ͱ͕͢ɺMac ͷ࣮ߦϑΝΠϧͰ͋Δ Mach-O

    ͸ͪΐͬͱݸੑతͳ ͷͰɺࠓճ͸ env Λࢦఆͯ͠ Alpine ޲͚ͷόΠφϦΛ࡞੒͠·͢ɻ env GOOS=linux GOARCH=amd64 go build hello.go ൺֱ༻ͷ C ϓϩάϥϜ͸ GCC ͰίϯύΠϧ͠·͢ɻ gcc -o c-hello hello.c
  4. readelf -S hello ɾҰ൪େ͖͍ͷ͸ .text ηΫγϣϯɻ ɹ͜Ε͸࣮ߦίʔυ͕֨ೲ͞Ε͍ͯΔྖҬͳͷͰ ɹͦ΋ͦ΋ͷ࣮ߦίʔυͷྔ͕ଟ͍ͱݴ͑Δɻ ɾͦΕʹ൐͍ .rodata

    (ఆ਺Λ֨ೲ͢ΔྖҬ)΋େ͖͍ ɾ.gopclntabɺ.note.go.buildid ͸ͳΜͩΖ͏ ɾ.gosymtab ͸࢖ΘΕͯͳͦ͞͏ɻ ɾσόοά༻ͷ৘ใ͕ଟ͍ </S> /BNF 4J[F %FDJNBM <> UFYU  <> SPEBUB  <> TITUSUBC  <> UZQFMJOL  <> JUBCMJOL  <> HPTZNUBC  <> HPQDMOUBC  <> OPQUSEBUB  <> EBUB  <> CTT  <> OPQUSCTT  <> [EFCVH@BCCSFW  <> [EFCVH@MJOF  <> [EFCVH@GSBNF  <> [EFCVH@QVCOBNF T  <> [EFCVH@QVCUZQFT  <> EFCVH@HEC@TDSJQU  <> [EFCVH@JOGP  <> [EFCVH@MPD  <> [EFCVH@SBOHFT  <> OPUFHPCVJMEJE  <> TZNUBC  <> TUSUBC 
  5. ɹHello World ͢Δ͚ͩͷ࣮ߦίʔυ͕ 550KBʁ ɾߴੑೳͳٯΞηϯϒϥͰ͋Δ IDA Pro Ͱ֬ೝ͢Δͱɺ ɹ͜ͷόΠφϦʹ͸ 1,800

    ΋ͷؔ਺͕ଘࡏͨ͠ɻ ɹؔ਺໊ΛݟΔݶΓɺ૊ࠐ΍ඪ४ύοέʔδͷؔ਺͕ଟ਺ ɹଘࡏ͍ͯ͠Δɻ ɾ΋ͪΖΜඪ४ύοέʔδͷ͢΂͕ͯ಺แ͞Ε͍ͯΔΘ͚Ͱ͸ͳ͘ɺ ɹmain ͷલॲཧ΍ fmt ͷॳظԽͳͲʹඞཁͳؔ਺͕٧Ίࠐ·Ε͍ͯΔɺͱ͍͏ҹ৅ ɾࢼ͠ʹ fmt Λ log ʹม͑ͨͱ͜ΖɺϑΝΠϧαΠζ͸98KB ૿Ճ͠ɺ ɹؔ਺͸ 8 ͭ૿͑ͨ(fmt ͸όΠφϦʹ࢒ͬͨ)ɻ ɹͦ͜Ͱ main ͷதͰ return Λฦ͚ͩ͢ͷۭϓϩάϥϜΛϏϧυͨ͠ͱ͜Ζɺ ɹαΠζ͸ 1MB ఔ౓ʹͳΓɺfmt ͷؔ਺΋͍ͳ͘ͳͬͨɻ ɹ͜ΕΒͷ͜ͱ͔Βɺlog ؔ਺͕಺෦తʹ fmt Λར༻͍ͯ͠Δ͜ͱ͕ਪ࡯͞ΕΔɻ ɾʲTipsʳࢼͨ͠ݶΓ࠷খͷ Hello World ͸ panic(“Hello World”) Ͱͨ͠ɻ(1,109KB) </S> /BNF 4J[F %FDJNBM <> UFYU  fmt.Println("Hello World") log.Println("Hello World") return
  6. What are … </S> /BNF 4J[F %FDJNBM <> HPQDMOUBC 

    <> OPUFHPCVJMEJE  readelf -x .gopclntab hello | tail 0x005446c0 70755f78 38362e73 00002f75 73722f6c pu_x86.s../usr/l 0x005446d0 6f63616c 2f43656c 6c61722f 676f2f31 ocal/Cellar/go/1 0x005446e0 2e31322e 352f6c69 62657865 632f7372 .12.5/libexec/sr 0x005446f0 632f696e 7465726e 616c2f63 70752f63 c/internal/cpu/c 0x00544700 70755f78 38362e67 6f00002f 7573722f pu_x86.go../usr/ 0x00544710 6c6f6361 6c2f4365 6c6c6172 2f676f2f local/Cellar/go/ 0x00544720 312e3132 2e352f6c 69626578 65632f73 1.12.5/libexec/s 0x00544730 72632f69 6e746572 6e616c2f 6370752f rc/internal/cpu/ 0x00544740 6370752e 676f0000 cpu.go.. readelf -x .note.go.buildid hello Hex dump of section '.note.go.buildid': 0x00400f9c 04000000 53000000 04000000 476f0000 ....S.......Go.. 0x00400fac 5f30646a 474b6377 62742d4a 35315664 _0djGKcwbt-J51Vd 0x00400fbc 7545384a 2f673373 55497a63 514a6d35 uE8J/g3sUIzcQJm5 0x00400fcc 42624459 427a2d42 652f4370 78593257 BbDYBz-Be/CpxY2W 0x00400fdc 6f6f5a4d 6e305844 706a2d58 674e2f49 ooZMn0XDpj-XgN/I 0x00400fec 34455850 797a5867 58586a43 4f713059 4EXPyzXgXXjCOq0Y 0x00400ffc 71353500 q55. ɾ.gopclntab ྖҬͷόΠφϦΛݟͨͱ͜Ζɺ ɹίϯύΠϧ࣌ʹಡΈࠐΜͩ .go ϑΝΠϧͷύε΍ؔ਺໊͕֨ೲ͞Ε͍ͯͨɻ ɹsrc/debug/gosym/pclntab.go ͷιʔεΛͬ͟ͱோΊͨͱ͜ΖɺϓϩάϥϜΧ΢ϯλͱιʔείʔυ ɹͷߦ൪߸ΛϚοϐϯά͍ͯ͠ΔΑ͏ʹݟ͑ͨɻ ɹιʔείʔυͷϑϧύε͕όΠφϦʹه࿥͞ΕΔͷ͸গ͠ؾʹͳΔ͕ɺ ɹڪΒ͘ελοΫτϨʔεͳͲ͕ࢀর͍ͯ͠ΔςʔϒϧͳͷͰ͸ͳ͍͔ɻ ɾ.note.go.buildid ͸ίϯύΠϧର৅ͷϑΝΠϧϋογϡ΍ίϯύΠϥͷόʔδϣϯ͕ه࿥͞Ε͍ͯΔɻ ɹˠखೖྗͷόʔδϣϯ൪߸ͳͲΑΓ͸৴པͰ͖Δ ID ͳͷͰɺ͜Ε͸σϓϩΠͨ͠όΠφϦͷ؅ཧͳͲʹ ɹɹ࢖͑ͦ͏ɻ
  7. go help build go help build ΍ Package build ΛಡΜͰΈΔͱྑ͍ɻ

    ɾ-tag ɹɾϏϧυλάΛ෇༩ͯ͠λάʹΑͬͯॲཧΛ෼ذͨ͠ΓͰ͖Δɻ ɾgo:binary-only-package ͱ໌ه͢Δ͜ͱͰύοέʔδΛόΠφϦͰ഑෍Ͱ͖Δ ɹɾ SDK Λ࡞ͬͨΓ͢Δ৔߹͸׆༻Ͱ͖ͦ͏ɻ ɾ-race ɹɾσʔλڝ߹ͷݕ஌ϞʔυΛ༗ޮʹ͢Δɻ ɾ-ldflags ɹɾπʔϧνΣΠϯͷ go tool link ʹҾ਺Λ౉͢͜ͱ͕Ͱ͖Δɻ
  8. ex) ɾ-L dir1 -L dir2 ɹˠ ࢦఆͨ͠σΟϨΫτϦ͔ΒΠϯϙʔτύοέʔδΛ୳͢ ɾ-race ɹˠ ϥΠϒϥϦͷڝ߹Λݕ஌͢Δ

    ɾ-s ɹˠ γϯϘϧςʔϒϧͱσόοά৘ใΛআڈ͢Δ ɾ-u ɹˠ unsafe ύοέʔδΛϦδΣΫτ͢Δ ɾ-w ɹˠ DWARF γϯϘϧςʔϒϧΛআڈ͢Δ ɾ-buildid id ɹˠ build id Λࢦఆ͢Δ go build ͷ -ldflags Φϓγϣϯ ɾϏϧυπʔϧνΣΠϯͷ go tool link ʹҾ਺Λ౉͢͜ͱ͕Ͱ͖Δɻ ɾgo tool link ͸ ֤ύοέʔδͷϏϧυΦϒδΣΫτΛͦͷґଘؔ܎ͱͱ΋ʹ ɹಡΈऔΓɺͦΕΒΛ࣮ߦՄೳόΠφϦʹόΠϯυ͢Δɻ(ελςΟοΫϦϯΫ) → GOROOT ഑Լʹ .a ͱ͍͏֦ுࢠͷϑΝΠϧ͕ͨ͘͞Μ͋Γ·͕͢ɺ ɹͦΕΒ͕֤ύοέʔδΛϏϧυͨ͠ΦϒδΣΫτͰ͢ɻgo tool compile Ͱ΋࡞ΕΔͬΆ͍ɻ ༨ஊ͕ͩղੳ༻ͷΦϓγϣϯ΋ॆ࣮͍ͯͨ͠ɻ ɾ-a ɹˠ ग़ྗ݁ՌΛٯΞηϯϒϧ͢Δ ɾ-c ɹˠ Ϗϧυ࣌ʹؔ਺ͷίʔϧάϥϑΛग़ྗ͢Δ ɾ-dumpdep ɹˠ γϯϘϧͷґଘؔ܎άϥϑΛμϯϓ͢Δ ɾetc… →Ͳ͏΍Β -s ϑϥά΍ -w ϑϥάͰϦϦʔεόΠφϦ͔Β ɹෆཁͳ৘ใΛ࡟ݮͰ͖ͦ͏ɻ
  9. go build -o hello-w -ldflags="-w" DWARF Λ࡟Δͱ 2,001KB → 1,571KB

    go build -o hello-sw -ldflags=“-s" γϯϘϧςʔϒϧͱσόοά৘ใΛ࡟Δͱ 2,001KB → 1,411KB ※-w ͷޮՌ͸ -s ʹؚ·Ε͍ͯͨ ࣮ߦϑΝΠϧʹΑͬͯηΫγϣϯͷߏ੒͸ҟͳΔͷͰɺ μΠΤοτޮՌͷ΄Ͳ͸ϑΥʔϚοτґଘɻ ɾαΠζ͚ͩʹண໨͢Δͱɺ͞ΒʹUPX ͰѹॖΛ͔͚ͯόΠφϦΛখ͘͢͞Δ ɹͱ͍͏هࣄ΋ݟ͔͚͕ͨɺύϑΥʔϚϯεͱτϨʔυΦϑʹͳΓͦ͏ͳͷͰ ɹෆ࠾༻ɻ
  10. readelf -S hello-s ɾσόοά৘ใ΍γϯϘϧςʔϒϧ͸ηΫγϣϯ͝ͱͳ͘ͳΓɺ ɹηΫγϣϯͷ਺΋൒෼ఔ౓ʹݮΓ·ͨ͠ɻ ɾΤϯυϢʔβʔʹ഑෍͢ΔΑ͏ͳΞϓϦέʔγϣϯͰ͋Ε͹Ұൠతʹ ɹσόοά৘ใ͸ෆཁͰ͋ΓɺΫϥοΩϯάͷࢳޱʹ΋ܨ͕ΔͨΊɺ ɹϦϦʔεϏϧυͰ͋Ε͹࡟আ(ετϦοϓ)͓͍ͯͨ͠ํ͕ద੾Ͱ͢ɻ </S> /BNF

    4J[F %FDJNBM  <> UFYU  <> SPEBUB  <> TITUSUBC  <> UZQFMJOL  <> JUBCMJOL  <> HPTZNUBC  <> HPQDMOUBC  <> OPQUSEBUB  <> EBUB  <> CTT  <> OPQUSCTT  <> OPUFHPCVJMEJE 
  11. ༨ஊ ɾࠓճ LT ͷςʔϚΛܾΊ͔ͯΒ Go ͷϏϧυπʔϧνΣʔϯΛ ɹோΊͯΈ·͕ͨ͠ɺϦϯΧ΍ίϯύΠϥ͕ go tool ͔Βݸผʹݺͼग़ͤΔ

    ɹػೳ͕ศརͩͱࢥ͍·ͨ͠ɻ →͜ΕΛ࢖ͬͨ Tips ͕৭ʑ͋Γͦ͏ɻ ɹϏϧυ͕࣌ؒ௕͘ͳ͖ͬͯͨ࣌ʹύοέʔδΛݸผʹϏϧυ͓͍ͯͯ͠ ɹϏϧυ࣌ؒΛ୹ॖ͢ΔͳͲɻ ɹ˞͓͢͢Ίͷ࢖͍ํ͕͋Ε͹ڭ͍͑ͯͩ͘͞ʂ ɾϦϯΧ΍ίϯύΠϥʹ͍ͭͯ΋શͯ GoDoc ͔ΒࢀরͰ͖Δͷ΋خ͍͠ɻ ɹυΩϡϝϯτ͕୳͠΍͘͢ɺॻࣜ΋౷Ұ͞Ε͍ͯΔͷͰΘ͔Γ΍͍͢ɻ ɹGo ͦΕࣗମ͕ Go Ͱॻ͔Ε͍ͯΔͷ͸ྑ͍จԽɻ ͭΒͭΒ࿩͠·͕ͨ͠Ҏ্Ͱ͢ɻ