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(154):
    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)
 
= 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 = { 3096973613,
    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(04), "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