Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
golt.pdf
Search
yu fujioka
June 24, 2019
260
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
golt.pdf
yu fujioka
June 24, 2019
More Decks by yu fujioka
See All by yu fujioka
OSS で知ってほしい セキュリティのこと
fujiokayu
0
110
about AWS Startup Security Baseline (AWS SSB)
fujiokayu
0
100
はじめよう DevSecOps
fujiokayu
1
240
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
The Pragmatic Product Professional
lauravandoore
37
7.4k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.2k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The Language of Interfaces
destraynor
162
27k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
260
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
450
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
yu fujioka : CypherTec Inc. Go ͷόΠφϦΛோΊΔ ͦͯ͠όΠφϦϑΝΠϧ͔Β Go ΛֶͿ
HPCVJME HPQDMOUBC MEqBHT > go version go version go1.12.5 darwin/amd64
whoami yu fujioka: ॴଐɿCypherTec Inc. ɾSoftware Engineer ݉ Security Engineer
ɾC++ Ͱͷ։ൃηΩϡϦςΟஅۀΛ୲ ɾGoɺTypeScript ͳͲΛษڧத ɾస৬Λػʹɺ2015ʹ౦ژ͔ΒಙౡݝҾͬӽ͠ ɾαςϥΠτΦϑΟεͷಋೖΛߟ͍͑ͯΔاۀͷํ ɾαςϥΠτΦϑΟεʹڵຯͷ͋ΔΤϯδχΞͷํ ɹ͓ؾܰʹֻ͓͚͍ͩ͘͞ɻ
go build Ͱੜ͞ΕΔ࣮ߦ ϑΝΠϧΛݟͯΈΑ͏
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
͜ͷࠩ Go : 2,001KB C : 8KB Go γϯάϧόΠφϦͰಈ࡞͢ΔʢϥϯλΠϜͷΠϯετʔϧ͕ෆཁʣͱ͍͏ େ͖ͳಛ͕͋ΓɺͦͷͨΊʹ࣮ߦϑΝΠϧ͕େ͖͘ͳΔͷ༰қʹ૾Ͱ͖Δɻ
ଓ͍ͯ͜ͷόΠφϦͷதΛղੳ͍͖ͯ͠·͢ɻ
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
ɹ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
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 ͳͷͰɺ͜ΕσϓϩΠͨ͠όΠφϦͷཧͳͲʹ ɹɹ͑ͦ͏ɻ
build ΦϓγϣϯΛ ͬͯϏϧυͯ͠ΈΑ͏
go help build go help build Package build ΛಡΜͰΈΔͱྑ͍ɻ
ɾ-tag ɹɾϏϧυλάΛ༩ͯ͠λάʹΑͬͯॲཧΛذͨ͠ΓͰ͖Δɻ ɾgo:binary-only-package ͱ໌ه͢Δ͜ͱͰύοέʔδΛόΠφϦͰͰ͖Δ ɹɾ SDK Λ࡞ͬͨΓ͢Δ߹׆༻Ͱ͖ͦ͏ɻ ɾ-race ɹɾσʔλڝ߹ͷݕϞʔυΛ༗ޮʹ͢Δɻ ɾ-ldflags ɹɾπʔϧνΣΠϯͷ go tool link ʹҾΛ͢͜ͱ͕Ͱ͖Δɻ
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 ϑϥάͰϦϦʔεόΠφϦ͔Β ɹෆཁͳใΛݮͰ͖ͦ͏ɻ
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 ͰѹॖΛ͔͚ͯόΠφϦΛখ͘͢͞Δ ɹͱ͍͏هࣄݟ͔͚͕ͨɺύϑΥʔϚϯεͱτϨʔυΦϑʹͳΓͦ͏ͳͷͰ ɹෆ࠾༻ɻ
readelf -S hello-s ɾσόοάใγϯϘϧςʔϒϧηΫγϣϯ͝ͱͳ͘ͳΓɺ ɹηΫγϣϯͷఔʹݮΓ·ͨ͠ɻ ɾΤϯυϢʔβʔʹ͢ΔΑ͏ͳΞϓϦέʔγϣϯͰ͋ΕҰൠతʹ ɹσόοάใෆཁͰ͋ΓɺΫϥοΩϯάͷࢳޱʹܨ͕ΔͨΊɺ ɹϦϦʔεϏϧυͰ͋Εআ(ετϦοϓ)͓͍ͯͨ͠ํ͕దͰ͢ɻ </S> /BNF
4J[F %FDJNBM <> UFYU <> SPEBUB <> TITUSUBC <> UZQFMJOL <> JUBCMJOL <> HPTZNUBC <> HPQDMOUBC <> OPQUSEBUB <> EBUB <> CTT <> OPQUSCTT <> OPUFHPCVJMEJE
༨ஊ ɾࠓճ LT ͷςʔϚΛܾΊ͔ͯΒ Go ͷϏϧυπʔϧνΣʔϯΛ ɹோΊͯΈ·͕ͨ͠ɺϦϯΧίϯύΠϥ͕ go tool ͔Βݸผʹݺͼग़ͤΔ
ɹػೳ͕ศརͩͱࢥ͍·ͨ͠ɻ →͜ΕΛͬͨ Tips ͕৭ʑ͋Γͦ͏ɻ ɹϏϧυ͕࣌ؒ͘ͳ͖ͬͯͨ࣌ʹύοέʔδΛݸผʹϏϧυ͓͍ͯͯ͠ ɹϏϧυ࣌ؒΛॖ͢ΔͳͲɻ ɹ˞͓͢͢Ίͷ͍ํ͕͋Εڭ͍͑ͯͩ͘͞ʂ ɾϦϯΧίϯύΠϥʹ͍ͭͯશͯ GoDoc ͔ΒࢀরͰ͖Δͷخ͍͠ɻ ɹυΩϡϝϯτ͕୳͘͢͠ɺॻࣜ౷Ұ͞Ε͍ͯΔͷͰΘ͔Γ͍͢ɻ ɹGo ͦΕࣗମ͕ Go Ͱॻ͔Ε͍ͯΔͷྑ͍จԽɻ ͭΒͭΒ͠·͕ͨ͠Ҏ্Ͱ͢ɻ
Thanks Gopher#5