어제까지 XOR과 index 연산 구조를 계속 반복하면서 익숙해졌다고 생각했는데,
오늘 문제에서는 역산 과정에서 실수가 발생했다.
단순한 구조였지만,
한 번 틀리고 다시 전체 흐름을 확인하면서 이해가 더 명확해진 문제였다.
1. 문제 구조
전체적인 흐름은 기존과 동일했다.
- 입력을 받는다
- check 함수로 전달
- 조건 만족 시 Correct
기드라에서 확인한 핵심 부분은 다음과 같다.
CALL strlen
CMP RAX, 0x6
CMP RAX, 0x6
입력 길이는 6으로 고정되어 있다.
2. key 값
메모리에서 key 값은 다음과 같이 확인된다.
MOV dword ptr [RBP + local_13], 0x4f4d4745
MOV word ptr [RBP + local_f], 0x5b51
MOV word ptr [RBP + local_f], 0x5b51
리틀엔디안 기준으로 정리하면:
0x45, 0x47, 0x4d, 0x4f, 0x51, 0x5b
3. 핵심 연산
핵심 연산은 다음과 같다.
ADD RAX, RDX ; + i
ADD ..., 0x3 ; + 3
XOR EAX, EDX ; ^ i
ADD ..., 0x3 ; + 3
XOR EAX, EDX ; ^ i
정리하면:
((input[i] + i) + 3) ^ i = key[i]
4. 첫 번째 역산 (오답)
처음에는 다음과 같이 역산했다.
input[i] = ((key[i] ^ i) - 3) - i
이 식으로 계산해서 나온 값은:
BBJFNV
하지만 이 값을 넣으면:

이 출력된다.
5. 재분석
문제가 이상해서 전체 어셈블리 흐름을 다시 확인하고,
C 코드 형태까지 같이 보면서 다시 정리했다.
그 과정에서 다음 부분을 다시 생각하게 됐다.
((input[i] + i) + 3) ^ i
여기서 XOR은 마지막 단계이므로
역산할 때는 가장 먼저 적용된다.
즉:
(key[i] ^ i)
여기까지는 동일하지만,
그 다음 단계에서 연산 순서를 다시 확인해야 했다.
6. 수정된 역산 (정답)
최종적으로 정리한 식은 다음과 같다.
input[i] = (key[i] ^ i) - 3
이 식으로 다시 계산한 결과:
BCLIR[
이 값을 입력하면:

가 출력된다.
7. 느낀 점
이번 문제에서 느낀 핵심은 다음과 같다.
“역산은 단순히 반대로 계산하는 것이 아니라,
실제 연산 흐름을 정확히 따라가야 한다”
특히 이번에는:
- i가 두 번 등장하는 구조
- XOR과 ADD 순서
- 역산 순서
이걸 정확히 구분하지 못해서 한 번 틀렸다.
8. 현재 상태 정리
지금 단계는
“식은 만들 수 있지만, 100% 정확하지는 않은 단계”
정도로 보인다.
그래도 틀린 이유를 스스로 찾고 수정했다는 점에서
이전보다 한 단계 올라온 느낌이다.