본문 바로가기
Write-up

[Crypto] 2019 CTFZONE agents : OFB 모드에서 값을 조작해야하는 문제

by dladbru 2019. 12. 2.

서버로부터 인증된 요원일 경우 주는 메시지

먼저 문제에 대해 설명을 하자면, 1번을 누를 경우, 요원이름과 장문의 랜덤한 암호문을 준다.

이후 이 암호문을 가지고 2번을 눌러 에이전트에게 이름과 암호문을 전달하면 믿을만한 요원이 아니기때문에 시크릿 메시지를 줄 수 없다고 한다.

 

이에 분석을 해서 알게된 것을 아래와 같이 추렸다.

 

알고있는 것:

1. AES-OFB모드로 암호화된 암호문

2. 세어보니 암호문은 자릿수는 337자리 (ECB와 OFB모드처럼 길이가 블럭단위가 아니다)

3. 한번 사용된 요원의 암호문은 재사용불가

4. 암호문은 JSON이다. (337자리에서 특정 바이트들을 깨서 보내보았는데 정상동작을 할때도 있고, "JSON Corrupted" 메시지가 뜰때도 있었음)

 

그래서 나는 JSON 값에 "{trust : 0}" 와 같은 필드가 존재해서 1이 될 경우, 믿을 만한 요원으로 생각해주지 않을까하여 0인 부분이 어디있는지는 알 수 없지만 무차별대입으로 0을 1로 변경했다.

 

 

그랬더니 11번째의 값을 변경했을 때 아래 사진과 같은 메시지를 받을 수 있었다.

서버로부터 인증된 요원일 경우 주는 메시지

믿을 만한 요원이라며 키가 아닌, RSA 암호문을 준다.. 그러면서 암호문안에 있는 공개키를 이용해서 암호화를 했다고한다. 나쁜뇬..

 

RSA 암호화와 복호화에 대해서 쓰인 어느 글

m(메시지)를 e라는 지수로 값을 증가시키고, n을 이용해 나머지 연산을 한다고 이해할 수 있었다.

그리고 RSA를 예전부터 봤기때문에 e는 65537이 사용됬을것이라고 생각했다. 

 

65537을 그냥 많이쓴다.

 

 

 

import socket
import base64

s = socket.create_connection(("crypto-agents.ctfz.one",9543))
s.recv(1024)
s.send("1\n")
r = s.recv(1024)
name = r.split("\"")[1]
r = s.recv(1024)
encoded = r.split("\n")[0]
d_encoded=base64.b64decode(encoded)
s.send("2\n")
r = s.recv(1024)
s.send(name+"\n")
r = s.recv(1024)
i=11
d_encoded=d_encoded[:i]+chr((ord(d_encoded[i])^1))+d_encoded[i+1:]
i=331
d_encoded=d_encoded[:i]+chr((ord(d_encoded[i])^0x36)^0x16^0x36)+d_encoded[i+1:]
i=332
d_encoded=d_encoded[:i]+chr((ord(d_encoded[i])^0x35)^0x15^0x35)+d_encoded[i+1:]
i=333
d_encoded=d_encoded[:i]+chr((ord(d_encoded[i])^0x35)^0x15^0x35)+d_encoded[i+1:]
i=334
d_encoded=d_encoded[:i]+chr((ord(d_encoded[i])^0x33)^0x13^0x33)+d_encoded[i+1:]
i=335
temp= d_encoded[:i]+chr((ord(d_encoded[i])^0x37)^0x6^0x37)+d_encoded[i+1:]
b_encoded=base64.b64encode(temp)
s.send(b_encoded+"\n")
print s.recv(1024)
print s.recv(1024)

 

그래서 65537이 어디에있는지 또한번 337자리를 무차별대입해서 돌아가는 부분을 찾아냈다.

11번째가 trust한지 확인하는 값이었고, 331번째부터가  65537 인것을 찾아내 1로 변경했다. 평문을 1로 지수승을해도 평문일것이기 때문에 아래와 같이 평문을 확인할 수 있다. GooD!

 

 

Flag: ctfzone{OFB_M0d3_C4n7_$4V3_A3$_K3Y}

반응형

댓글