[ISITDTU 2018] Baby Write-up

2018. 7. 30. 18:14


CTF가 끝나고 한 번 풀어본다.

CTF 기간 중에는 팀원님이 아주 빠르게 풀어주셨다...

나는 RSA문제에 막혀서 ㅠㅠㅠ



아직 서버가 살아있어서 nc로 접속하면 아래와 같이 사용자로 부터 숫자입력을 받고, 뭔가를 출력해준다.

소스파일도 주어졌으므로 먼저 소스파일을 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    def hash(self, m):
        f = int(flag.encode("hex"),16)
        x = sha512(str(f | m )).digest().encode("hex")
        self.request.sendall(x+"\n")
 
        
        
 
    def check(self):
        while True:
            self.request.sendall("********************Hello World********************\n")
            self.request.sendall("***************************************************\n")
            self.request.sendall("Number: ")
            try:
                number = int(self.request.recv(BUFF_SIZE).strip())
            except:
                break
            self.request.sendall(str(number)+"\n")
            self.hash(number)
cs


사용자로부터 Number를 입력받은 후

number와 flag를 or하여, 그 값을 sha512해시값으로 해서 출력해준다.


이 flag의 값은 변하지않고, 사용자는 Number를 써서 flag과 or한 결과값을 계속 얻을 수 있으므로 0과 flag를 OR한 값과 다른 bit들을 비교하여 공격하면된다. 

즉 bit flipping하여 1bit씩 브루트포싱하는 것이다.


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
import socket
 
flag_hash = "2c7b44d69a0f28798532e4bb606753128969e484118bd0baa215c6309ce6dc016c9a5601471abf4c556c0dc5525eb4144078a761a6456c919d134be8a10c64a0"
 
def recv_until(s, string):
    result = ''
    while string not in result:
        result += s.recv(1)
    return result
 
def get_hash(num):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('35.185.178.212'33337))
    recv_until(sock, ':')
    sock.send(str(num)+"\n")
    recv_until(sock, '\n')
    hash = recv_until(sock, '\n')
    sock.close()
    return hash[:-1]
 
flag = ""
c=0
while(True):
    onebyte = 0
    for i in range(8):
        num = (1<<i)
        hash = get_hash(num<<(8*c))
        if flag_hash==hash:
            onebyte+=num
    c+=1
    flag = chr(onebyte)+flag
    if "ISITDTU{" in flag:
        break
    print(flag)
 
print("FLAG : " + flag)
cs




성공



'Write-up > Crypto' 카테고리의 다른 글

[ISITDTU 2018] XOR Write-up  (0) 2018.07.30
[ISITDTU 2018] Simple RSA Write-up  (0) 2018.07.30
[MeePwnCTF 2018] bazik  (0) 2018.07.25
[MeePwnCTF 2018] esor (easy)  (0) 2018.07.16
[MeePwnCTF 2018] esor (hard)  (0) 2018.07.16

+ Recent posts