Wargame/rev
아 문제 이름 뭘로하지- Write-Up
EYEN
2025. 3. 6. 21:28

1. 문제 개요
주어진 바이너리 코드에서 특정 문자열을 입력하면 correct라는 메시지를 출력하는 프로그램을 분석한다. 우리의 목표는 해당 프로그램이 어떤 문자열을 "올바른 값"으로 인식하는지 찾는 것이다.
2. 코드 분석
주어진 C 코드 조각을 통해 main 함수는 사용자 입력을 받고, sub_145A 함수를 호출하여 올바른 값인지 검사한다.
2.1 sub_145A 함수 분석
BOOL8 __fastcall sub_145A(__int64 a1) {
if (strlen((const char *)a1) != 39)
return 0LL;
// 입력을 s1 배열에 복사
__int64 s1[4];
int v5;
__int16 v6;
char v7;
s1[0] = *(_QWORD *)a1;
s1[1] = *(_QWORD *)(a1 + 8);
s1[2] = *(_QWORD *)(a1 + 16);
s1[3] = *(_QWORD *)(a1 + 24);
v5 = *(_DWORD *)(a1 + 32);
v6 = *(_WORD *)(a1 + 36);
v7 = *(_BYTE *)(a1 + 38);
// 변형 수행
sub_1273(s1, 39LL);
// 정답 문자열 생성
char s2[40];
sub_139D(s2);
return memcmp(s1, s2, 0x27uLL) == 0;
}
위 코드에서 sub_1273이 입력 문자열을 변형하고, sub_139D가 정답 문자열을 생성한 후, memcmp를 통해 두 문자열을 비교한다.
2.2 sub_139D 함수 분석
for (i = 0; i <= 0x26; ++i)
*((_BYTE *)v5 + i) = byte_2120[i] ^ 0xAA;
byte_2120 배열의 각 바이트를 0xAA와 XOR하여 s2를 생성한다. 즉, s2[i] = byte_2120[i] ^ 0xAA이다.
byte_2120 값 (HEX)
EE E2 D1 FA C6 CF CB D9 CF F5 C6 C5 DC CF F5 DE C2 CF
F5 ED EE F5 FF E8 EF F8 E7 EF F9 E2 F5 CB C6 C8 DF C7 8B 8B D7
위 값을 XOR 연산하면 정답 문자열(s2)이 복원된다.
2.3 sub_1273 함수 분석
이 함수는 입력(s1)을 변형하는 역할을 한다.
v2 = sub_123E(
(unsigned __int8)(byte_2020[(unsigned __int8)(((-83 - (i & 7)) * ((i & 7) - 34)) ^ i)]
+ (*(_BYTE *)(a1 + i) ^ (i + (-83 - (i & 7)) * ((i & 7) - 34)))),
(unsigned int)(i % 7) + 3);
여기서 sub_123E는 단순한 비트 회전 연산(rotate right) 이다.
__int64 __fastcall sub_123E(unsigned __int8 a1, char a2) {
return ((int)a1 >> a2) | (a1 << (8 - a2));
}
3. 정답 문자열 복원
3.1 정답 문자열(s2) 복구 (Python 코드)
byte_2120 = [
0xEE, 0xE2, 0xD1, 0xFA, 0xC6, 0xCF, 0xCB, 0xD9, 0xCF,
0xF5, 0xC6, 0xC5, 0xDC, 0xCF, 0xF5, 0xDE, 0xC2, 0xCF,
0xF5, 0xED, 0xEE, 0xF5, 0xFF, 0xE8, 0xEF, 0xF8, 0xE7,
0xEF, 0xF9, 0xE2, 0xF5, 0xCB, 0xC6, 0xC8, 0xDF, 0xC7,
0x8B, 0x8B, 0xD7
]
# XOR 연산 수행
s2 = [b ^ 0xAA for b in byte_2120]
# 출력
print("s2 복원된 값:", bytes(s2).decode(errors='ignore'))
print("s2 (HEX):", ' '.join(f'{b:02X}' for b in s2))
3.2 변형(reverse sub_1273)
s1을 올바른 s2로 변환해야 하므로, sub_1273의 연산을 역으로 수행해야 한다. 이는 비트 연산과 XOR 연산을 원래대로 돌리는 과정을 포함한다.
Note: sub_1273의 변형 과정을 역연산하는 코드를 작성하여 s1을 복원하면, 최종적으로 올바른 입력을 찾을 수 있다.
4. 결론
- s2를 복구하면 프로그램이 비교하는 "정답 문자열"을 얻을 수 있다.
- sub_1273의 변형 과정을 역으로 수행하면 "정답 문자열"에 대응하는 입력(s1)을 찾을 수 있다.
- 최종적으로 이 입력을 프로그램에 주면 "correct" 메시지를 받을 수 있다.
