CTF
YISF 2018 final
Gyeongje
2018. 8. 23. 02:14
못푼거
misc png 문제 (품)
misc 이진 (풀거같음)
reversing 500점 app (품)
Web 500점 base64 php 소스 긁어와서 품 (공부)
pwnable 500점 버퍼오버플로우는 찾았는데 fsb 가 있었음 sprintf에서 카나리 릭하면됨 (공부)
푼거
forensic 500 (mysql 비번 지우고 가서 select * from 테이블명 where flagtruechar = 1 치면 플래그 긁어와짐)
pwnable 1000 (은행에서 6만원 얻고 머니 -6만원 되면 게임져서 0원 된다음 3천원 복귀 후 돈 바꾸고 RTL 익스)
misc_png_solve
\x78\x9c 로 시작함 zlib은
010 editor로 보면 png 하나하나에 zlib로 압축되어 있음.
그거 밑에 처럼 디컴파일 한다음에 딱 이어붙여서 png 만들면 flag있음.
근데 341 byte라고 함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import zlib file = 'C:/Users/ohyt0/Desktop/YSIF_2018_final/MISC_FINAL/' data = '' for i in range(1, 54): f = open(file + str(i) + '.png', 'rb') d = f.read() idx = d.find('\x78\x9C') d = d[idx:idx+341] f.close() data += zlib.decompress(d) f = open(file + 'Flag.png', 'wb') f.write(data) f.close() | cs |
reversing 500점 (answer = h2#)
핵심 : https://github.com/0xd4d/dnSpy
dnSpy 를 사용할것 (C#문제) 다보임;;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { public sealed class Program { static void Main(string[] args) { int[] encrypt = { 30, 96, 97, 36, 13, 87, 35, 30, 76, 54, 89, 79, 10, 85, 67, 48, 98, 26, 3, 84, 9, 15, 82, 5, 38, 123, 123, 58, 27, 109, 48, 14, 14, 47, 106, 17, 54, 95, 123, 33, 89, 9, 27, 30, 84, 114, 40 }; int check = 1; for (int bf1 = 33; bf1 < 127; bf1++) { for (int bf2 = 33; bf2 < 127; bf2++) { for (int bf3 = 33; bf3 < 127; bf3++) { for(int bf4 = 33; bf4 < 127; bf4++) { string text = ""; switch (check) { case 1: text = (Convert.ToChar(bf4)).ToString(); break; case 2: text = (Convert.ToChar(bf3)).ToString() + (Convert.ToChar(bf4)).ToString(); break; case 3: text = (Convert.ToChar(bf2)).ToString() + (Convert.ToChar(bf3)).ToString() + (Convert.ToChar(bf4)).ToString(); break; case 4: text = (Convert.ToChar(bf1)).ToString() + (Convert.ToChar(bf2)).ToString() + (Convert.ToChar(bf3)).ToString() + (Convert.ToChar(bf4)).ToString(); break; } Console.WriteLine(text); int[] a = Program.Calc(Program.ByteCompare(encrypt, text)); int[] numArray = Program.LeftRotationByD(a, Program.sum(text) % a.Length); String answer = ""; foreach (char ch in numArray) answer += ch; if(string.Compare(answer.Substring(0, 4), "YISF") == 0) { Console.WriteLine(answer); Environment.Exit(0); } } if (check < 2) check = 2; } if (check < 3) check = 3; } if (check < 4) check = 4; } } private static int[] ByteCompare(int[] a1, string a2) //a2 : text { int[] numArray = new int[a1.Length]; for (int index1 = 0; index1 < a1.Length; ++index1) { int index2 = index1 % a2.Length; switch (index2) { case 0: numArray[index1] = (int)a2[index2] ^ a1[index1]; break; case 1: numArray[index1] = (int)a2[index2] ^ a1[index1]; break; case 2: numArray[index1] = (int)a2[index2] ^ a1[index1]; break; case 3: numArray[index1] = (int)a2[index2] ^ a1[index1]; break; default: break; } } return numArray; } private static int[] Calc(int[] a1) { for (int index = 0; index < a1.Length; ++index) a1[index] += 7; return a1; } private static int[] LeftRotationByD(int[] a, int k) { int[] numArray = new int[a.Length]; int length = a.Length; for (int index1 = 0; index1 < length; ++index1) { int index2 = index1 - k; int index3 = length + index2; if (index2 >= 0) numArray[index2] = a[index1]; else numArray[index3] = a[index1]; } return numArray; } private static int sum(string a1) { int num = 0; for (int index = 0; index < a1.Length; ++index) num += (int)a1[index]; return num; } } } | cs |