[XCZ.KR] 28번 풀이
Wargame/XCZ.KR

[XCZ.KR] 28번 풀이

 

 

문제 종류 - Network
사용한 툴 - HxD, Wireshark, Sublime Text 3(Python 3.x)
Flag, Hint, 정답 형식

flag: ?

hint: X

정답 형식: md5(오랜친구의 IP_포트_키)

풀이

사실 지금까지 Network 문제들은 모두 전투력 측정기였다.

문제 풀기도 전에 이 문제를 푼 사람이 60명밖에 없어서 자존감 하락하고 시작했다. (이제는 61명 ㅎㅅㅎ)

 

문제에 들어가면 pcap 파일이 하나 주어진다. Wireshark를 이용해 열어주자.

제일 먼저 HTTP을 사용해 통신한 파일들부터 봐보도록 하겠다.

맨 밑에서 Chat.exe 라는 .exe 파일 하나를 발견했다.

Chat.exe가 이 문제를 푸는데 매우 중요한 역할을 한다. 이 파일을 추출해 실행해보자.

문제를 잘 읽어보면 A씨는 문제의 답을 찾기 위해 오랜 친구와 비밀 접선을 했다고 적혀있다.

이 프로그램을 이용해 서로 채팅을 했다고 추측할 수 있다.

이제 Wireshark로 다시 돌아가자.

잡다한 패킷을 모두 거르기 위해 다음과 같이 Wireshark Filter에 입력한다.

!udp && !tcp.port == 80 && !tcp.port == 443

ARP는 당연히 아니고, 저 밑에 TCP 통신 쪽이 채팅 부분이라고 추측된다.

TCP Stream을 통해 내용을 확인해보자.

이 문자열을 보는 순간 그때부터 삽질하기가 매우 쉽다.

문제에 A씨는 친구와 비밀 접선을 했다고 적혀있으니 이 문자열은 채팅 내용의 암호문이라고 추측된다.

어떤 암호화 알고리즘을 통해 암호화되는지는 한눈에 알아보기 어렵다.

그러므로 Chat.exe를 우리가 직접 실행해보자.

나는 VM Machine(Virtual Windows) <-> Desktop 2개를 사용해 서로 통신을 시켜봤다.

Virtual Windows에는 dll, ocx 파일이 없기 때문에 다음 경로에 파일을 넣어주자.

 

C:\Windows\SysWOW64\VB6KO.DLL

C:\Windows\SysWOW64\MSWINSCK.OCX

 

먼저 VM에 IP를 확인해주자. (네트워크 환경은 각자 다르다.)

VM IP: 192.168.0.100

이제 Desktop에 IP를 알아보자.

Desktop IP: 192.168.0.8

IP 주소를 알았으니 나는 VM에서 채팅방을 만들고 Desktop에서 방에 접속해보도록 하겠다.

접속에 성공하면 다음과 같은 메시지 박스가 나타난다.

이제 Desktop에서 Wireshark를 켜서 패킷을 캡처해보자.

캡쳐 중인 상태로 VM에서는 ABC, Desktop에서는 abc를 보내보겠다.

자 이제 Wireshark 캡처를 중단해준다.

이제 Wireshark Filter에 다음과 같이 입력해준다.

ip.addr == <VM IP> ( ex: ip.addr == 192.168.0.100 )

입력 후, 저 부분을 TCP Stream을 떠보자.

TCP Stream을 떠보면 다음과 같다.

VM에서 보낸 ABC는 101/97/97/34로 암호화되었고, Dekstop에서 보낸 abc는 64/66/124/31로 암호화되었다.

이제 저 암호문이 평문과 어떤 규칙을 갖는지 찾아보도록 하자.

 

1. ABC -> 101/97/97/84

먼저 ABC를 Decimal 값으로 바꾸면 65/66/67이다.

합과 차의 관계라고 하기에는 서로 아무런 관계가 없어서 XOR 연산이라고 추정했다.

우선 값 3개를 넣었는데 4개로 암호화된 이유는 문자열이 끝났다는 것을 의미하는 separating byte로 추정된다.

이제 각각의 byte 값을 XOR 연산해보자.

 

65 ^ 101 = 36

66 ^ 97  = 35

67 ^ 97  = 34

1st XOR Key = 36

 

아직까지는 특별한 규칙을 발견 못할 수도 있다.

이제 Desktop에서 보낸 abc를 XOR 연산해보도록 하자.

 

2. abc -> 64/66/124/31

abc를 Decimal 값으로 바꾸면 97/98/99이다.

 

64 ^ 97 = 33

66 ^ 98 = 32

124 ^ 99 = 31

1st XOR Key = 33

 

이제 각각의 XOR Key간의 관계를 찾을 수 있을 것이다.

XOR 연산을 한 번 할수록 XOR Key가 1씩 줄어들고 있다.

ASCII에 최대 bit 크기는 7bit 이기 때문에 XOR Key의 값은 0~127 사이라는 것 또한 추측할 수 있을 것이다.

1st XOR Key는 딱히 규칙이 없어보이기 때문에 Brute Force 코드를 짜보도록 하겠다. 코드는 다음과 같다.

arr 값에는 암호문을 넣어주면 된다.

하나씩 넣어보도록 하겠다. 먼저 이부분이다.

102/100/13 >  HI!

 

106/72/94/63/87/105/59/104/58/104/109/126/98/112/52/114/50/125/127/97/105/45/120/98/103/108/38/892/92/69/17/88/78/88/72/12/82/69/92/8/69/67/64/74/28/3512/99/46/98/45/47/80/85/84/82/92/26/95/87/69/22/84/20/85/94/80/87/1/4789/83/27/67/86/77/23/93/91/91/68/18/87/92/78/73/18/45121/116/106/126/58/116/125/55/98/125/113/51/98/112/99/124/121/98/126/111/42/121/100/125/38/81/42/87/3 >  Hi~ It's quite a long time. How have you been? Do you know flag? I'm looking for a flag.

 

120/116/58/96/119/98/54/98/117/125/124/112/48/105/98/108/107/52/42/98/99/873/74/79/69/13/10/4331/1/20/15/17/68/23/10/4/64/120/54/41/40/43/96/118/119/47/53/47/122/56/32/126/56/32/35/40/60/42/45/44/103/127/112/119/114/117/39/36/121/12/9/89/5/12/92/1/9/5/87/13/81/6/5/85/2/29/76/27/30/78/79/27/17/9/76/85/67/4/2/74/75/116/31 > do you wanna flag? visit the '<다음 문제로 넘어가는 사이트>'. kkk

 

105/116/99/100/56/25 > thx~!

라는 문자열이 나오게 된다. 저기서 나온 다음 문제로 넘어가는 사이트로 이동해보자.

 

사이트에 들어가면 검은색 단색으로 되어있는 것 같은 이미지 하나가 주어진다.

이 이미지를 다운받고 HxD로 분석해보자.

우선 Header, Footer 모두 정상적이다.

header
Footer

그러나 뭔가 이상한 점이 있다. 검은색 단색으로 칠해져 있는 이미지 파일에 "04 A2 8A 28" 만 있는게 아니라

다른 문자열들도 있는 것이다.

단색으로 칠해져 있다면 모두 "04 A2 8A 28" 값을 가지고 있어야 한다.

이 이미지가 검은색 단색이 아니라는 것을 알아채고 그림판에 해당 이미지를 넣어봤다.

그림판에 페인트통 기능을 사용하여 다른 색을 찾아내자.

여기까지 왔다면 IP, Port는 당연히 찾았을 것이라고 생각한다.

 

 

'Wargame > XCZ.KR' 카테고리의 다른 글

[XCZ.KR] 30번 풀이  (0) 2020.05.02
[XCZ.KR] 29번 풀이  (0) 2020.05.02
[XCZ.KR] 27번 풀이  (0) 2020.05.01
[XCZ.KR] 25번 풀이  (0) 2020.05.01
[XCZ.KR] 24번 풀이  (0) 2020.05.01