본문 바로가기

CTF

[Samsung CTF 2017] Easyhaskell

Samsung CTF 2017 Easyhaskell reversing 200pt


해당문제를 IDA로 보았는데 어.. C로 만들어진 바이너리가 아님을 깨달았다.

일단 실행시켜보면서 곰곰히 보는데 인자값으로 해당 암호화 값이 변하진 않고 

해당 문제의 이름으로 암호화 값이 만들어지는 것 같다.

혹시 몰라 a 와 aa의 이름으로 바꿔 값을 확인해봤는데 이건 누가봐도 base64다. 

패딩값으로 5를 쓰는데 브루트포스로 테이블을 구해 답을 구할 수 있지만 나는 그냥 브루트포스 했다.


[Solve]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from os import *
import subprocess
 
def solve(flag, index):
    for bf in bf_table:
           name = flag + bf
           rename('change', name)
           out = subprocess.check_output('./' + name, shell=True, stderr=subprocess.PIPE)
           out = out[1:len(out)-2]
           rename(name, 'change')
 
           if out == en_flag:
               print "Flag is " + name
               exit(1)
           if out.find(en_flag[:index + 1]) > -1:
               solve(name, index + 2)
           elif out.find(en_flag[:index]) > -1:
               solve(name, index + 1)
 
bf_table = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_!?@#}*'
en_flag = '=ze=/<fQCGSNVzfDnlk$&?N3oxQp)K/CVzpznK?NeYPx0sz5'
rename('EasyHaskell''change')
solve('SCTF{'8#1char==8bit | 'SCTF{'+bf(1char)==6char | 6*8/6(base64 is 6bit split)==8
cs


1
2
pwnr00t@System:~/gyeongje$ python EasyHaskell.py 
Flag is SCTF{D0_U_KNoW_fUnc10N4L_L4n9U4g3?}
cs


+ base64 table 구해서 decode

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
def binary_number(str):
    bin = [0 for i in range(6)]
    for i in range(5-1-1):
        bin[i] = str & 1
        str >>= 1
    return bin
 
 
def demical_number(str):
    num = str[0]
    for i in range(18):
        num = num * 2 + str[i]
    return num
 
 
if __name__ == '__main__':
    b64_table = "|yt2QGYA;u_RCeD0H/c)=NWVo&6nPk9$~dOKa?:<w81T!f3ip]Bxzl@sJjMrXS%#"
    dest = []
    s = []
    de = []
    de_str = ''
 
    str = "=ze=/<fQCGSNVzfDnlk$&?N3oxQp)K/CVzpznK?NeYPx0sz5"
    for i in str:
        if i != '5':
            s += binary_number(b64_table.index(i))
 
    arr = []
    for i in range(len(s)):
        arr.append(s[i])
        if (i + 1) % 8 == 0 and i != 0:
            dest.append(arr)
            arr = []
 
    for i in range(len(dest)):
        de.append(demical_number(dest[i]))
 
    for i in range(len(de)):
        de_str += chr(de[i])
 
    print de_str
#SCTF{D0_U_KNoW_fUnc10N4L_L4n9U4g3?}
cs


'CTF' 카테고리의 다른 글

[Nuit Du Hack 2017] Matriochka Step 1  (0) 2018.02.07
[Tokyo Westerns 2017] Rev Rev Rev  (0) 2018.02.07
[Codegate 2018] BaskinRobins31  (0) 2018.02.05
[Codegate 2018] easy_serial  (2) 2018.02.05
[Codegate 2018] RedVelvet  (0) 2018.02.05