Slide 1

Slide 1 text

#seccamp2018 Ͱηϧϑϗε τ C ίϯύΠϥΛͭͬͨ͘ ࠡ ᲒᲶ @ushitora anqou 1

Slide 2

Slide 2 text

ͲΜͳͻͱ ࠡ ᲒᲶʢ͏͠ͱΒ ͋Μ͜͏ʣ • Twitter: @ushitora anqou • ීஈ͸ C++Ͱ༡ΜͩΓ༡͹ΕͨΓɻ • constexpr Ͱ NN ͱ͔ॻ͖·ͨ͠ɻ GitHub ʹ͋ΔͷͰελʔ͍ͩ͘͞ɻ • Kernel ΋ VM ΋Θ͔Γ·ͤΜɻษڧ͠ ·͢ɻ 2

Slide 3

Slide 3 text

seccamp ͬͯͳʹ ηΩϡϦςΟɾΩϟϯϓશࠃେձ 2018 • 8 ݄ 14 ೔ʙ18 ೔ @౦ژ౎෎தࢢ • IPA ओ࠵ͷ߹॓ܗࣜͷษڧձ • ʮY-II C ίϯύΠϥΛࣗ࡞ͯ͠ΈΑ ͏ʂʯθϛʹࢀՃ • ߨࢣ͸ Rui ͞Μͱ hikalium ͞Μ 3

Slide 4

Slide 4 text

Y-II ͷ໨ඪ 4

Slide 5

Slide 5 text

೔ఔ Day N ΍Δ͜ͱ Day 1 ։ձࣜͱ͔ʢ։ൃͳ͠ʣ Day 2 ։ൃ Day 3 ։ൃ Day 4 ։ൃ Day 5 ดձࣜͱ͔ʢ։ൃͳ͠ʣ 7 ݄ͷ಄͔Βࣄલֶशͱͯ͠։ൃΛ࢝ΊΔɻ 5

Slide 6

Slide 6 text

Day 0

Slide 7

Slide 7 text

Day 0 ηϧϑϗετͰ͖ͨ 6

Slide 8

Slide 8 text

͓͡͞Μͳʹͨ͠ͷ ηϧϑϗετͷ x86-64 ޲͚ C ίϯύΠϥ aqcc Λॻ͍ͨɻ • System V AMD64 ABI ४ڌɻ • C ϓϩάϥϜΛಡΈࠐΈΞηϯϒϦΛ ग़ྗɻ 7

Slide 9

Slide 9 text

ηϧϑϗετ ࣗ෼ࣗ਎ΛίϯύΠϧͰ͖Δɻ • aqcc ͸ C ݴޠͰॻ͔Ε͍ͯΔɻ • aqcc ͸ C ݴޠίϯύΠϥͰ͋Δɻ • Ώ͑ʹ aqcc ͸ aqcc ͰίϯύΠϧͰ ͖Δɻ 8

Slide 10

Slide 10 text

ηϧϑϗετ seccamp ࠷ऴ೔·Ͱʹ 6 ਓத 3 ਓ͕ୡ੒ɻ 9

Slide 11

Slide 11 text

ͭ͘Γ͔ͨ 10

Slide 12

Slide 12 text

ͭ͘Γ͔ͨ ΍Δ͚ͩ 10

Slide 13

Slide 13 text

ͭ͘Γ͔ͨ 11

Slide 14

Slide 14 text

ͭ͘Γ͔ͨ • ೖྗจࣈྻΛτʔΫϯྻʹ෼ׂ͢Δɻ 11

Slide 15

Slide 15 text

ͭ͘Γ͔ͨ • ೖྗจࣈྻΛτʔΫϯྻʹ෼ׂ͢Δɻ • τʔΫϯྻΛղऍ͠ந৅ߏจ໦ ʢASTʣʹ͢Δɻ 11

Slide 16

Slide 16 text

ͭ͘Γ͔ͨ • ೖྗจࣈྻΛτʔΫϯྻʹ෼ׂ͢Δɻ • τʔΫϯྻΛղऍ͠ந৅ߏจ໦ ʢASTʣʹ͢Δɻ • ҙຯղੳΛߦ͍ AST ΛŢœŕͱ͢Δɻ 11

Slide 17

Slide 17 text

ͭ͘Γ͔ͨ • ೖྗจࣈྻΛτʔΫϯྻʹ෼ׂ͢Δɻ • τʔΫϯྻΛղऍ͠ந৅ߏจ໦ ʢASTʣʹ͢Δɻ • ҙຯղੳΛߦ͍ AST ΛŢœŕͱ͢Δɻ • Ţœŕͱͳͬͨ AST ΛݩʹΞηϯϒϦΛ ੜ੒͢Δɻ 11

Slide 18

Slide 18 text

ͭ͘Γ͔ͨ • ೖྗจࣈྻΛτʔΫϯྻʹ෼ׂ͢Δɻ • τʔΫϯྻΛղऍ͠ந৅ߏจ໦ ʢASTʣʹ͢Δɻ • ҙຯղੳΛߦ͍ AST ΛŢœŕͱ͢Δɻ • Ţœŕͱͳͬͨ AST ΛݩʹΞηϯϒϦΛ ੜ੒͢Δɻ • ੜ੒ͨ͠ΞηϯϒϦΛ͍͍ײ͡ʹ࠷ద Խ͢Δɻ 11

Slide 19

Slide 19 text

ͭΒ͔ͬͨͱ͜Ζ • ΞηϯϒϦ͕෼͔Βͳ͍ɻ • ΞηϯϒϦΛॻ͘ͷ͸ॳΊͯɻ • lea ͬͯͳʹɻ • C ͷݴޠ࢓༷͕෼͔Βͳ͍ɻ • C ͷݴޠ࢓༷ΛಡΉͷ͸ʢ΄΅ʣॳΊͯɻ • ൚੔਺֦ுͬͯͳʹɻ 12

Slide 20

Slide 20 text

C ݴޠ࢓༷ͷ͕͜͜ΩϞ͍ʂ • ϙΠϯλ͕ΩϞ͍ʂ • int* p, q; ͷ q ͸ int • ؔ਺એݴ͕ΩϞ͍ʂ • int foo(); ͱ int foo(){...} ͱ int foo; ͷ۠ผɻ • Մม௕Ҿ਺͕ΩϞ͍ʂ • va list ͱ͔ va start() ͱ͔ɻ • va list ͷఆٛͱ͔஌ͬͯ·͢ʁ 13

Slide 21

Slide 21 text

ଓɾC ݴޠ࢓༷ͷ͕͜͜ΩϞ͍ʂ • switch ͕ΩϞ͍ʂ • if-else ͱ͍͏ΑΓ΋࣮࣭ goto switch (1) { int a = 2; case 3: 1; int b = 5; break; case 1: a = 1; b = 0; default: printf("%d␣%d", a, b); // 1 0 } 14

Slide 22

Slide 22 text

ଓʑɾC ݴޠ࢓༷ͷ͕͜͜ΩϞ͍ʂ • ߏ଄ମఆ͕ٛΩϞ͍ʂ • ߏ଄ମఆٛ΋ int ΋ type-specifier ͳͷ Ͱಉ͡ͱ͜Ζʹॻ͚Δɻ struct hogehoge { int piyopiyo; } foobar (); int foobar (); 15

Slide 23

Slide 23 text

ଓʑɾC ݴޠ࢓༷ͷ͕͜͜ΩϞ͍ʂ • ߏ଄ମఆ͕ٛΩϞ͍ʂ • ߏ଄ମఆٛ΋ int ΋ type-specifier ͳͷ Ͱಉ͡ͱ͜Ζʹॻ͚Δɻ struct hogehoge { int piyopiyo; }; int; 15

Slide 24

Slide 24 text

ΠϯΫϦϝϯλϧͳ։ൃ • ੔਺ 1 ݸΛฦ͢ʮ͸Γ΅ͯ C ίϯύΠ ϥʯ͔Βελʔτɻ • ঃʑʹػೳΛ଍͢ɻҰؾʹ࡞Βͳ͍ɻ • Rui ͞ΜͷςΩετ΍ Slackɾhangout Ͱॿ͚͍͍ͯͨͩͨɻ 16

Slide 25

Slide 25 text

DAY 2 17

Slide 26

Slide 26 text

DAY 2 ΍Δ͜ͱ͕ͳ͍ 17

Slide 27

Slide 27 text

ͳʹΛ͠Α͏͔ ίʔυੜ੒ͷํࣜΛม͑Α͏ɻ • ελοΫϚγϯ • ݱঢ়ͷ࣮૷ɻ • ϨδελϚγϯ • ͬͪ͜ʹ͍ͨ͠ɻ 18

Slide 28

Slide 28 text

ελοΫϚγϯ • શͯͷ໋ྩ͸ελοΫΛհͯ͠ૢ࡞Λ ͢Δɻ • ελοΫ͸ϝϞϦ্ʹ͋ΔͷͰ஗͍ɻ 19

Slide 29

Slide 29 text

ϨδελϚγϯ • શͯͷ໋ྩ͸ϨδελΛհͯ͠ૢ࡞Λ ͢Δɻ • Ϩδελ͸ CPU ʹ͋ΔͷͰ଎͍ɻ 20

Slide 30

Slide 30 text

Ͳ͏΍Δͷ ࢖͑ΔϨδελ • ؔ਺ͷҾ਺ʹ࢖͏Ϩδελ΍γϑτԋ ࢉͳͲɺಛघͳ༻్Ͱ࢖ΘΕΔϨδε λΛආ͚Δɻ • r10, r11, r12, r13, r14, r15 ͕ ࢖͑Δɻ 21

Slide 31

Slide 31 text

ϨδελϚγϯͷͭ͘Γ͔ͨ • ॲཧͷ࢝·ΓͱऴΘΓͰ push, pop ͢Δ୅ΘΓʹɺϨδελ͔Β৘ใΛ ҾͬுͬͨΓऔ͖ͬͯͨΓ͢Δɻ • AST ͷ༿ϊʔυ͔Βίʔυੜ੒͢Δͱ ͖ʹɺσʔλΛ֨ೲͨ͠ϨδελΛ਌ ʹฦ͢ɻ 22

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

DAY 3 ϨδελϚγϯʹͳͬͨ 23

Slide 34

Slide 34 text

ŰƅŲŔŖŵƃţͷܭଌ ϨδελϚγϯͷ aqcc (2142d05) ͷιʔ είʔυΛશͯ࿈݁͠ɺ͜ΕΛίϯύΠϧ ͢Δ࣌ؒΛ perf ίϚϯυͰଌఆ͢Δɻ 24

Slide 35

Slide 35 text

ŰƅŲŔŖŵƃţ ελοΫϚγϯ (85ee93c) • gcc -O2 0.09287 ± 0.00187 seconds • aqcc 0.40217 ± 0.00277 seconds ໿ 4.3 ഒ 25

Slide 36

Slide 36 text

ŰƅŲŔŖŵƃţ ϨδελϚγϯ (2142d05) • gcc -O2 0.090094 ± 0.000310 seconds • aqcc 0.21281 ± 0.00286 seconds ໿ 2.3 ഒ 26

Slide 37

Slide 37 text

ͭΒ͔ͬͨͱ͜Ζ σόοά͕ͱʹ͔ͭ͘Β͍ɻ • gcc ͰͷιʔείϯύΠϧ͸Ͱ͖Δɻ • ίϯύΠϧͨ͠ίϯύΠϥͰͷιʔε ίϯύΠϧ͕Ͱ͖ͳ͍ɻ 27

Slide 38

Slide 38 text

ͭΒ͔ͬͨͱ͜Ζ 28

Slide 39

Slide 39 text

ͭΒ͔ͬͨͱ͜Ζ 29

Slide 40

Slide 40 text

ͭΒ͔ͬͨͱ͜Ζ • σόοά৘ใ͕ͳ͍ʂ • མ͍ͪͯΔͱ͜Ζʹόά͕͋ΔΘ͚ ͡Όͳ͍ʂ 29

Slide 41

Slide 41 text

ͭΒ͔ͬͨͱ͜Ζ ؒҧ͍͑ͯͨͷ͸ɺϨδελୀආͰͨ͠ɻ • ؔ਺ݺͼग़࣌͠ʹอଘ͢΂͖Ϩδελ ΛҰͭ๨Ε͍ͯͨɻ • ΘΓͱΈΜͳܦݧ͢Δಓɻ 30

Slide 42

Slide 42 text

ŰƅŲŔŖŵƃţʢ࠶ܝʣ ϨδελϚγϯ (2142d05) • gcc -O2 0.090094 ± 0.000310 seconds • aqcc 0.21281 ± 0.00286 seconds ໿ 2.3 ഒ 31

Slide 43

Slide 43 text

2.3 ⇒ 2 ഒʹ͍ͨ͠ʂ ग़ྗ͢ΔΞηϯϒϦΛ࠷దԽ͢Δɻ ४උ • ग़ྗίʔυΛه߸ʢstruct Codeʣʹ ஔ͖׵͑Δɻ • ͦΕ·Ͱ͸จࣈྻͰѻ͍ͬͯͨɻ • େྔʹॻ͖׵͑Δ΂͖৔ॴ͕͋Δɻ • ͱͯ΋ͭΒ͍ɻ 32

Slide 44

Slide 44 text

2.3 ⇒ 2 ഒʹ͍ͨ͠ʂ ग़ྗ͢ΔΞηϯϒϦΛ࠷దԽ͢Δɻ • ఆ਺஋৞ΈࠐΈ • a = 1 + 5 * 8 + 1; =⇒ a = 42; • AST Λ෦෼తʹΠϯλϓϦτ͢Ε͹ ྑ͍ɻ 32

Slide 45

Slide 45 text

ଓɾ࠷దԽ • dead code elimination ҙຯͷͳ͍ίʔυ͸ੜ੒͠ͳ͍Α͏ʹ ͢Δɻ • propagation mov (%rax), %r11 =⇒ mov -8(%rbp), %r11 ૊Έ߹Θ͍͍ͤͯײ͡ʹ࠷దԽ͢Δɻ 33

Slide 46

Slide 46 text

݁Ռ 34

Slide 47

Slide 47 text

݁Ռ όάͬͨ 34

Slide 48

Slide 48 text

݁Ռ όάͬͨ seccamp ऴྃ 34

Slide 49

Slide 49 text

ؼΓͷ৽װઢ propagation ͷࡍʹϨδελͷґଘؔ܎Λม ߋ͢Δ͜ͱΛ๨Ε͍ͯͨɻ 35

Slide 50

Slide 50 text

ଓଓɾ࠷దԽ • ؔ਺ͷதͰ࢖͍ͬͯΔϨδελ͚ͩΛ ୀආ͢Δ • r12, r13, r14, r15 ͸ callee-saved. • ؔ਺๯಄Ͱ push ͠ऴΘΓͰ pop. • શͯΛอଘ͢Δͱ͕͔͔࣌ؒΔɻ • ॻ͖׵͑Δ΋ͷ͚ͩͰྑ͍ɻ 36

Slide 51

Slide 51 text

ŰƅŲŔŖŵƃţ ࠷దԽͨ͠ aqcc(4fcc2d3) 37

Slide 52

Slide 52 text

ŰƅŲŔŖŵƃţ ࠷దԽͨ͠ aqcc(4fcc2d3) • gcc -O2 0.13015 ± 0.00126 seconds • aqcc 0.24342 ± 0.00108 seconds ໿ 1.87 ഒ 37

Slide 53

Slide 53 text

Φν͕ͳ͍ 38

Slide 54

Slide 54 text

aqcc ͰίϯύΠϧ test.c ΛίϯύΠϧ͍ͨ͠ɻ % ./aqcc test.c > test.s • ίϯύΠϧ 39

Slide 55

Slide 55 text

aqcc ͰίϯύΠϧ test.c ΛίϯύΠϧ͍ͨ͠ɻ % ./aqcc test.c > test.s • ίϯύΠϧ % gcc -c test.s -o test.o • Ξηϯϒϧ % gcc test.o -o test all.o • ϦϯΫ 39

Slide 56

Slide 56 text

౰વͷؼ݁ 40

Slide 57

Slide 57 text

౰વͷؼ݁ ͦ͏ͩ ΞηϯϒϥΛ ͭ͘Ζ͏ 40

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

Ξηϯϒϥ

Slide 61

Slide 61 text

Ξηϯϒϥͭͬͨ͘ 43

Slide 62

Slide 62 text

Ξηϯϒϥͷͭ͘Γ͔ͨ 44

Slide 63

Slide 63 text

Ξηϯϒϥͷͭ͘Γ͔ͨ ΍Δ͚ͩ 44

Slide 64

Slide 64 text

Ξηϯϒϥͱ͸ ΞηϯϒϦΛΦϒδΣΫτϑΝΠϧʹม׵ ͢Δɻ • χʔϞχοΫΛΦϖίʔυʹม׵ ͢Δɻ • ඞཁͳγϯϘϧ৘ใͳͲΛ·ͱΊͯ ELF ʹ͢Δɻ 45

Slide 65

Slide 65 text

MOV ໋ྩ mov %eax, %edx 46

Slide 66

Slide 66 text

MOV ໋ྩ mov %eax, %edx =⇒ 89 c2 Opcode Instruction 89 /r MOV r/m32,r32 46

Slide 67

Slide 67 text

MOV ໋ྩ mov %eax, %edx =⇒ 89 c2 Opcode Instruction 89 /r MOV r/m32,r32 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 1 1 0 0 0 0 1 0 46

Slide 68

Slide 68 text

MOV ໋ྩ mov %rax, %rdx 47

Slide 69

Slide 69 text

MOV ໋ྩ mov %rax, %rdx =⇒ 48 89 c2 Opcode Instruction REX.W + 89 /r MOV r/m64,r64 47

Slide 70

Slide 70 text

MOV ໋ྩ mov %rax, %rdx =⇒ 48 89 c2 Opcode Instruction REX.W + 89 /r MOV r/m64,r64 7 6 5 4 3 2 1 0 REX Prefix 0 1 0 0 W R X B 0 1 0 0 1 0 0 0 47

Slide 71

Slide 71 text

MOV ໋ྩ mov %r8, %r10 48

Slide 72

Slide 72 text

MOV ໋ྩ mov %r8, %r10 =⇒ 4d 89 c2 Opcode Instruction REX.W + 89 /r MOV r/m64,r64 48

Slide 73

Slide 73 text

MOV ໋ྩ mov %r8, %r10 =⇒ 4d 89 c2 Opcode Instruction REX.W + 89 /r MOV r/m64,r64 7 6 5 4 3 2 1 0 REX Prefix 0 1 0 0 W R X B 0 1 0 0 1 1 0 1 48

Slide 74

Slide 74 text

MOV ໋ྩ mov %eax, (%rdx) 49

Slide 75

Slide 75 text

MOV ໋ྩ mov %eax, (%rdx) =⇒ 89 02 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 0 0 0 0 0 0 1 0 49

Slide 76

Slide 76 text

MOV ໋ྩ mov %eax, -4(%rdx) =⇒ 89 42 fc 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 0 1 0 0 0 0 1 0 50

Slide 77

Slide 77 text

MOV ໋ྩ mov %eax, -4(%rbp) =⇒ 89 45 fc 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 0 1 0 0 0 1 0 1 51

Slide 78

Slide 78 text

MOV ໋ྩ mov %eax, (%rbp) =⇒ 89 45 00 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 0 1 0 0 0 1 0 1 52

Slide 79

Slide 79 text

MOV ໋ྩ mov %eax, -4(%rip) =⇒ 89 05 fc ff ff ff 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 0 0 0 0 0 1 0 1 53

Slide 80

Slide 80 text

·ͱΊ inst mod r/m code (%rdx) 00 010 89 02 -4(%rdx) 01 010 89 42 fc -4(%rbp) 01 101 89 45 fc (%rbp) 01 101 89 45 00 -4(%rip) 00 101 89 05 fc ff ff ff ͱͯ΋ͭΒ͍ɻ 54

Slide 81

Slide 81 text

MOV ໋ྩ mov %eax, -400(%r11) 55

Slide 82

Slide 82 text

MOV ໋ྩ mov %eax, -400(%r11) =⇒ 41 89 83 70 fe ff ff 7 6 5 4 3 2 1 0 ModR/M mod reg r/m 1 0 0 0 0 0 1 1 55

Slide 83

Slide 83 text

MOV ໋ྩ mov %eax, -400(%r11) =⇒ 41 89 83 70 fe ff ff mov %eax, -400(%r12) 56

Slide 84

Slide 84 text

MOV ໋ྩ mov %eax, -400(%r11) =⇒ 41 89 83 70 fe ff ff mov %eax, -400(%r12) =⇒ 41 89 84 24 70 fe ff ff 56

Slide 85

Slide 85 text

MOV ໋ྩ mov %eax, -400(%r11) =⇒ 41 89 83 70 fe ff ff mov %eax, -400(%r12) =⇒ 41 89 84 24 70 fe ff ff 7 6 5 4 3 2 1 0 SIB scale index base 0 0 1 0 0 1 0 0 56

Slide 86

Slide 86 text

MOV ໋ྩ mov %eax, -400(%r12) =⇒ 41 89 84 24 70 fe ff ff scale = 20 = 1 index = %rsp base = %r12 disp = -400 ͜ͷͱ͖ scale × index + base + disp 57

Slide 87

Slide 87 text

MOV ໋ྩ mov %eax, -400(%r12) =⇒ 41 89 84 24 70 fe ff ff scale = 20 = 1 index = %rsp base = %r12 disp = -400 ͜ͷͱ͖ scale × index + base + disp ͨͩ͠ index = %rsp =⇒ scale = 0 57

Slide 88

Slide 88 text

݁ہ n(%r12) ͷͱ͖ʹ 24 ΛຒΊࠐΊ͹͍͍ɻ if (mod == 2 && rm == 4) emit_byte(modrm(0, 4, 4)); ίϝϯτ͕ඞཁ 58

Slide 89

Slide 89 text

// ͜ͷߦΛফ͢ͱམͪΔɻ ΧʔΰɾΧϧτɾϓϩάϥϛϯάͱ͸ ࣮ࡍͷ໨తʹ͸໾ʹཱͨͳ͍ίʔυ΍ϓϩάϥϜ ߏ଄ΛّࣜతʹؚΊ͓ͯ͘ϓϩάϥϛϯάͷελ ΠϧͰ͋Δɻ(Wikipedia ΑΓൈਮ) 59

Slide 90

Slide 90 text

// ͜ͷߦΛফ͢ͱམͪΔɻ ΧʔΰɾΧϧτɾϓϩάϥϛϯάͱ͸ ࣮ࡍͷ໨తʹ͸໾ʹཱͨͳ͍ίʔυ΍ϓϩάϥϜ ߏ଄ΛّࣜతʹؚΊ͓ͯ͘ϓϩάϥϛϯάͷελ ΠϧͰ͋Δɻ(Wikipedia ΑΓൈਮ) // ... // That ’s why this line is needed. // NOT CARGO CULT PROGRAMMING !! if (mod == 2 && rm == 4) emit_byte(modrm(0, 4, 4)); 59

Slide 91

Slide 91 text

ΞηϯϒϥͭΒ͍ • ELF ෼͔ΒΜɻ • gas ͸೥਺Λײͤ͡͞Δίʔυɻ • aqcc ʹ long ͕ແ͍ɻ emit qword( 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00); gas ͷग़ྗ΍ʰϦϯΧɾϩʔμ࣮ફ։ൃς ΫχοΫʱΛ΋ͱʹௐ੔ɻ 60

Slide 92

Slide 92 text

aqcc ͰίϯύΠϧʢ࠶ܝʣ test.c ΛίϯύΠϧ͍ͨ͠ɻ % ./aqcc test.c > test.s • ίϯύΠϧ % gcc -c test.s -o test.o • Ξηϯϒϧ % gcc test.o -o test all.o • ϦϯΫ 61

Slide 93

Slide 93 text

aqcc ͰίϯύΠϧ test.c ΛίϯύΠϧ͍ͨ͠ɻ % ./aqcc test.c test.o • ίϯύΠϧ&Ξηϯϒϧ % gcc test.o -o test all.o • ϦϯΫ 62

Slide 94

Slide 94 text

ࣗ໌ͳ༠ಋ 63

Slide 95

Slide 95 text

ࣗ໌ͳ༠ಋ ͦ͏ͩ ϦϯΧΛ ͭ͘Ζ͏ 63

Slide 96

Slide 96 text

No content

Slide 97

Slide 97 text

No content

Slide 98

Slide 98 text

ϦϯΧͭͬͨ͘ 66

Slide 99

Slide 99 text

ϦϯΧͭͬͨ͘ C ඪ४ϥΠϒϥϦ΋࡞ͬͨɻ 66

Slide 100

Slide 100 text

No content

Slide 101

Slide 101 text

ͳʹ΍ͬͨͷ ϦϯΧΛॻ͖͔ͨͬͨɻ • ϦϯΧͷσβΠϯ͸ʰϦϯΧɾϩʔμ ࣮ફ։ൃςΫχοΫʱΛ͞Βʹ؆୯ʹ ͨ͠΋ͷɻ • glibc Α͘Θ͔ΒΜɻ • aqcc Ͱ࢖༻͢Δඪ४ϥΠϒϥϦؔ਺͸ ߴʑ༗ݶݸɻ=⇒ ΍Δ͚ͩ 68

Slide 102

Slide 102 text

malloc(3) Λ࣮૷ aqcc ͸ malloc() ͢Δ͕ free() ͠ͳ͍ɻ 69

Slide 103

Slide 103 text

malloc(3) Λ࣮૷ aqcc ͸ malloc() ͢Δ͕ free() ͠ͳ͍ɻ char *p = brk (0); int size = 0x32000000; char *q = brk(p + size ); ... if (malloc_remaining_size < size) return NULL; 69

Slide 104

Slide 104 text

aqcc ͷϝϞϦޮ཰ • ίϯύΠϧ͚ͩͳΒແ໰୊ɻ • ϦϯΫ͚ͩͳΒແ໰୊ɻ (e.g., lld) • ίϯύΠϧɾΞηϯϒϧɾϦϯΫͩͱ ϝϞϦΛ৯ͬͯͭΒ͍ɻ Ͳ͏͢Δʁ 70

Slide 105

Slide 105 text

ݴྶ.in 71

Slide 106

Slide 106 text

໊ݴ ๻͸ϗϯϞϊͷϓϩάϥϚͰ͸͋Γ·ͤΜ ͔Βɺ΍͚ͬͭ࢓ࣄͰ͢ΑɻϗϯϞϊͷϓ ϩάϥϚ͸ɺ ʮಈ͍ͯΔΑ͏ʹݟ͑Δ͚Ͳɺ ϝϞϦϦʔΫͩΒ͚͡Όͳ͍͔ɻ௚͢ඞཁ ͕͋Δ͔΋ͶʯͳΜͯݴ͏Ͱ͠ΐ͏ʁ ๻ ͳΒɺ10 ϦΫΤετ͝ͱʹ Apache Λ࠶ى ಈ͠·͢Ͷɻ 72

Slide 107

Slide 107 text

໊ݴ ๻͸ϗϯϞϊͷϓϩάϥϚͰ͸͋Γ·ͤΜ ͔Βɺ΍͚ͬͭ࢓ࣄͰ͢ΑɻϗϯϞϊͷϓ ϩάϥϚ͸ɺ ʮಈ͍ͯΔΑ͏ʹݟ͑Δ͚Ͳɺ ϝϞϦϦʔΫͩΒ͚͡Όͳ͍͔ɻ௚͢ඞཁ ͕͋Δ͔΋ͶʯͳΜͯݴ͏Ͱ͠ΐ͏ʁ ๻ ͳΒɺ10 ϦΫΤετ͝ͱʹ Apache Λ࠶ى ಈ͠·͢Ͷɻ ʕʕ ϥεϚεɾϥʔυϑ (PHP ։ൃऀ) 72

Slide 108

Slide 108 text

ػೳΛ෼ׂ • ./aqcc cs main.c main.s ίϯύΠϧ • ./aqcc so main.s main.o Ξηϯϒϧ • ./aqcc oe main.o main.exe ϦϯΫ खͰଧͭͷ͸গʑ໘౗ɻ 73

Slide 109

Slide 109 text

γΣϧεΫϦϓτΛॻ͘ • ./aqcc main.c -o main.exe =⇒ ݸผͷػೳΛదٓݺͿɻ gcc ͬΆ͔͚͘Δʂ 74

Slide 110

Slide 110 text

·ͱΊ 75

Slide 111

Slide 111 text

·ͱΊ • ίϯύΠϥ =⇒ ΍Δ͚ͩ 75

Slide 112

Slide 112 text

·ͱΊ • ίϯύΠϥ =⇒ ΍Δ͚ͩ • Ξηϯϒϥ =⇒ ΍Δ͚ͩ 75

Slide 113

Slide 113 text

·ͱΊ • ίϯύΠϥ =⇒ ΍Δ͚ͩ • Ξηϯϒϥ =⇒ ΍Δ͚ͩ • ϦϯΧ =⇒ ΍Δ͚ͩ 75

Slide 114

Slide 114 text

·ͱΊ • ίϯύΠϥ =⇒ ΍Δ͚ͩ • Ξηϯϒϥ =⇒ ΍Δ͚ͩ • ϦϯΧ =⇒ ΍Δ͚ͩ • ඪ४ϥΠϒϥϦ =⇒ ΍Δ͚ͩ 75

Slide 115

Slide 115 text

·ͱΊ • ίϯύΠϥ =⇒ ΍Δ͚ͩ • Ξηϯϒϥ =⇒ ΍Δ͚ͩ • ϦϯΧ =⇒ ΍Δ͚ͩ • ඪ४ϥΠϒϥϦ =⇒ ΍Δ͚ͩ ʊਓਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹ΍Δ͚ͩπʔϧνΣΠϯɹʻ ʉ Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ʉ 75

Slide 116

Slide 116 text

͝ਗ਼ௌ ͋Γ͕ͱ͏͟͝ ͍·ͨ͠ɻ 76

Slide 117

Slide 117 text

ࢀߟจݙ • ʮ௨৴༻ޠͷجૅ஌ࣝʯ https://www.wdic.org/ • ʰϦϯΧɾϩʔμ࣮ફ։ൃςΫχοΫʱ ࡔҪ ߂྄ɺCQ ग़൛ࣾɺ2010 • ݴྶ.in http://www.kotodama.in/ 77

Slide 118

Slide 118 text

ࢀߟจݙ • IntelR ⃝ 64 and IA-32 Architectures Software Developer Manuals https://software.intel.com/ en-us/articles/intel-sdm • N1548 Committee Draft Š December 2, 2010 ISO/IEC 9899:201x http://www.open-std.org/jtc1/ sc22/wg14/www/docs/n1548.pdf 78