워게임 풀이
Reversing.Kr
This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil@reversing.kr
reversing.kr
8. Direct3D FPS

문제 파일을 실행해보니 FPS 게임이 실행된다. 어어어어엄청 천천히 움직인다.

길을 따라갔더니 한승연과 움직이는 고구마들이 나온다. 고구마를 총으로 쏴도 아무런 일이 발생하지 않는다...


고구마에 닿으면 HP가 닳고, HP가 0이 되고 종료된다.

고구마를 많이 쏘면 죽는다.

Game Over! You are dead와 Game Clear!가 보인다.

코드를 프로그래밍 언어로 더 쉽게 보기 위해서 ida로 열었다. View>String을 추가해서 보니 똑같이 Game Over와 Game Clear 문자열이 보인다.
"Game Over!" 문자열에 접근하는 코드는 다음과 같다.

잘 모르겠어서 다시 올리디버거로..

Game Clear! 쪽으로 가니 이상한 문자열이 보인다.


고구마 몬스터를 죽였더니 문자열 값이 달라졌다. 고구마 몬스터를 다 죽이면 FLAG가 나오는 건가??

문자열을 복호화 하는 부분을 찾기 위해 이상한 문자열에 BP를 걸어주고 고구마 몬스터를 조금 더 잡아보았다.
고구마 몬스터를 죽음>문자열 복호화>문자열의 변화
라는 순서로 진행될 것이라 생각했기 때문에...

복호화 해주는 부분이다. 하지만 이상한 문자열과 XOR연산을 하고 있는 CL의 값을 알 수 없기 때문에 000C3427에서 CL이 받아오는 메모리 주소에 BP를 걸었다.

위 부분이 이상한 문자열과 XOR 연산을 할 값을 만드는 부분이다. 이 부분에서 0부터 4의 배수 순서대로 0xX4까지 있는 배열을 만든다. 바로 이 배열과 50byte의 이상한 문자열을 XOR 연산하는 것이다.
50byte의 문자열 (이상한 문자열)
이상한 문자열의 Hex 값을 이용해서 xor 연산을 하는 파이썬 코드를 작성했다.
str = [ 0x43, 0x6B, 0x66, 0x6B, 0x72, 0x75, 0x6C, 0x69, 0x4C, 0x45, 0x5C, 0x45,
0x5F, 0x6E, 0x46, 0x1C, 0x47, 0x25, 0x25, 0x29, 0x20, 0x17, 0x34, 0x39,
0x01, 0x16, 0x49, 0x4C, 0x20, 0x15, 0x0B, 0x0F, 0xF7, 0xEB, 0xFA, 0xE8,
0xB0, 0xFD, 0xEB, 0xBC, 0xF4, 0xCC, 0xDA, 0x9F, 0xF5, 0xF0, 0xE8, 0xCE,
0xF0, 0xA9 ]
for i in range(0, 50): #50byte
xor = str[i] ^ (i*4)
print(chr(xor))

Password 뒤에 오는 문자열이 flag 같다.
Thr3EDPr0m
'Reversing' 카테고리의 다른 글
[Reversing] Easy Unpack_WirteUp (0) | 2023.05.28 |
---|---|
[Reversing] AutoHotkey1_WirteUp (0) | 2023.05.27 |
[Reversing] Position_WirteUp (1) | 2023.05.24 |
패킹과 언패킹 (0) | 2023.05.17 |
[Reversing] Replace_WirteUp (0) | 2023.05.13 |