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

golt.pdf

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for yu fujioka yu fujioka
June 24, 2019
250

 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 Ͱॻ͔Ε͍ͯΔͷ͸ྑ͍จԽɻ ͭΒͭΒ࿩͠·͕ͨ͠Ҏ্Ͱ͢ɻ