1. 문제
1) 문제 확인
서든 마냥 게임이 플레이된다. 괴상한 달걀같은 놈이 엄청 많이 나오는데 총으로 쏘면 죽는다. 그리고 몸에 닿으면 내 피가 깍이면서 죽는다. 근데 진짜 속도가 개느리고 한놈 죽이는데 너무 많이 총을 쏴야해서 답답해 뒤지는줄 알았다. 뭘 어케 하라는거지?
2) 코드흐름 파악
int *sub_4039C0()
{
int *result; // eax
result = clear_monster;
while ( *result != 1 )
{
result += 0x84;
if ( (int)result >= (int)&check_flag )
{
MessageBoxA(hWnd, msg_content, "Game Clear!", 0x40u);
return (int *)SendMessageA(hWnd, 2u, 0, 0);
}
}
return result;
}
문자열을 보던 중 'Game Clear!' 를 참조하여 해당 함수를 확인하였다. result가 1이 아닐때 0x84만큼 더하고 그 값이 check_flag보다 크면 성공하는거 같다. 출력되는 메시지 함수내용을 확인해보면
널 바이트 전까지 대략 0x32 사이즈의 이상한 문자열이 들어가 있다. 저거를 복구시면 될듯?
2. 접근방법
위 문자열을 참조하는 다른 영역을 확인해보니 다음 함수를 발견했다
int __thiscall sub_403400(void *this)
{
int monster; // eax
int monster_hp; // edx
monster = ((int (__cdecl *)(void *))sub_403440)(this);
if ( monster != -1 )
{
monster_hp = v3[0x84 * monster];
if ( monster_hp > 0 )
{
v3[0x84 * monster] = monster_hp - 2;
}
else
{
clear_monster[0x84 * monster] = 0;
msg_content[monster] ^= decode_key[0x210 * monster];
}
}
return monster;
}
결론부터 말하면, 사용자가 총구의 포커스를 달걀귀신에 갖다댄 뒤 총을 한발 쏘면 여기 함수에 bp가 걸린다. monster에 들어있는 값이 -1이 아니면, 해당 값을 인덱스로 하여 v3 배열의 어떤 값을 가져온다. 여기는 아마도 달걀귀신의 hp로 추정된다.
달걀귀신의 hp가 0보다 크면 아직 안죽었다는 의미로 -2를 하고 다시 저장한다. 즉 v3[0x84*monster]
요거는 달걀귀신의 피가 저장된다. 그리고 monster에는 달걀귀신의 ID값이라고 보면 된다. 만약 달걀귀신의 hp가 0이면 아까 괴상한 문자열의 한바이트를 decode_key로 디코딩한다.
그럼 저 디코드 키만 뭔지 알면 끝난다. 아이다로는 알기힘들어서 이후부턴 디버깅을 통해 확인하였다.
위 로직이 디코딩 루틴이다.
- 0xF97028 : 괴상한 문자열의 위치
- 0xF99184 : 디코딩 키 배열의 위치
- cl( 0xF99184 + ecx ) : 0xF9AE64 ⇒0x38
- eax : 0xE // 달걀귀신 ID
즉 괴상한 문자열 + 0xE 위치의 한 바이트와 cl(0x38)을 xor하여 디코딩한다.
다른 달걀귀신을 죽여서 반복되는 패턴이 있는지 찾아보자
이번에는 ID값이 0x26인 달걀귀신을 죽였다. 그럼 괴상한 문자열 + 0x26에 위치한 값을 디코딩하는데 그때사용하는 키 값은 0x98이다. 여기서 보면 패턴이 보인다
디코딩 키 값은 달걀귀신 ID 값 * 4 이다. 따라서 괴상한 문자열을 한바이트씩 각 인덱스 * 4와 xor 연산을 하면 디코딩된 문자열을 얻을수 있을 것이다
3. 풀이
4. 몰랐던 개념
'워게임 > reversing.kr' 카테고리의 다른 글
[reversing.kr] Ransomware (0) | 2020.12.22 |
---|---|
[reversing.kr] Position (0) | 2020.12.16 |
[reversing.kr] ImagePrc (0) | 2020.12.15 |
[reversing.kr] Replace (0) | 2020.12.14 |
[reversing.kr] Music Player.exe (0) | 2020.12.11 |
Uploaded by Notion2Tistory v1.1.0