본문 바로가기

5. 방학 활동/Write UP

[2022.01~02]방학활동 - Dreamhack 워게임 문제 풀이

안녕하세요 성신여대 해킹동아리 I.Sly() 입니다 :)

2021년 겨울방학 스터디로 팀을 꾸려 5주간 드림핵 워게임 문제 풀이를 진행했는데요,

스터디를 어떻게 진행했는지 소개 후, 풀이한 워게임 문제 중 rev-basic-5 이라는 문제도 같이 풀어봅시다! ><

 

저희는 Notion 워크스페이스를 이용하여 스터디를 진행했습니다!

Notion

스터디 1주차는 리버싱, 2주차는 , 3주차는 포너블 문제 풀이를 했고, 4, 5주차는 각자 공부하고 싶은 분야를 자유롭게 풀어왔습니다.

 

1주차 - 리버싱

 

2주차 - 웹

 

3주차 - 포너블

4주차

 

5주차

 

 

5주간 팀원들과 문제를 풀고, 어려운 부분은 서로 공유하면서 정말 유익한 시간을 보냈습니다 ㅎㅎ

rev-basic-5 풀이

스터디를 통해 푼 문제들 중 rev-basic-5 문제 풀이를 진행해볼건데요, 모든 문제를 풀이하고 싶지만 드림핵정찰대한테 혼나면 안되니깐,,ㅎㅎ 한문제만 풀이를 진행해보도록 하겠습니다 :)

 

문제

리버싱 문제는 보통 올바른 입력값을 찾는 문제가 많은데, 이 문제도 바이너리를 분석하여 올바른 입력값인 flag를 찾는 문제였습니다!

 

바이너리 분석은 IDA를 사용하여 진행했습니다.

140001130 주소를 확인해보면, 사용자의 입력을 비교하여 같으면 "Correct", 틀리면 "Wrong"을 출력하는 것을 볼 수 있습니다. 

 

여기서 f5 단축키를 누르면 C언어로 작성된 디컴파일 코드를 볼 수 있습니다. 

코드를 보면 사용자가 입력한 값을 sub_14001000과 비교하여 처리해주는 것을 확인할 수 있습니다.

sub_140001000 를 더블클릭하면

다음과 같은 코드를 볼 수 있습니다.

0x18(24)번 for문 반복하고, (unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) 연산을 수행하여

aNAcTbIeNgbsl[i] 와 비교하는 것을 알아낼 수 있습니다. (a1은 사용자가 입력한 값)

 

즉, a1[i+1] + a1[i] = aNAcTbIeNgbsl[i] 가 되는 거겠죠?

 

aNAcTbIeNgbsl[] 배열에는 다음과 같은 값이 들어있습니다.

AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 DC C7 AD A3 A1 98 4C 00

 

여기서 연산식에 위 배열 값을 대입해보면,

aNAcTbIeNgbsl[22] = a1[22]+a1[23] = 4C 이고,

aNAcTbIeNgbsl[23] = a1[23] + a1[24] = 0 입니다. 

 

이렇게 되면 a1[23] = a1[24] =0 이므로, a1[22]=4c가 됩니다.

 

이를 알아냈으면, a1[21]의 값도 알아낼 수 있습니다. 

98 = a1[21] + 4c 이므로

a1[21] = 4c 가 됩니다. 

 

이런 식으로 맨 뒤부터 값을 구하는 코드를 짜면 다음과 같습니다.

 

flag 획득!