카테고리 없음

리버싱 입문 Day 15 - strlen + i 연산 + XOR 구조에서 역산 실수 정리

baa1983 2026. 4. 27. 12:43

어제까지 XOR과 index 연산 구조를 계속 반복하면서 익숙해졌다고 생각했는데,
오늘 문제에서는 역산 과정에서 실수가 발생했다.

단순한 구조였지만,
한 번 틀리고 다시 전체 흐름을 확인하면서 이해가 더 명확해진 문제였다.


1. 문제 구조

전체적인 흐름은 기존과 동일했다.

  • 입력을 받는다
  • check 함수로 전달
  • 조건 만족 시 Correct

기드라에서 확인한 핵심 부분은 다음과 같다.

 
CALL strlen
CMP RAX, 0x6
 

입력 길이는 6으로 고정되어 있다.


2. key 값

메모리에서 key 값은 다음과 같이 확인된다.

 
MOV dword ptr [RBP + local_13], 0x4f4d4745
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
 

정리하면:

((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% 정확하지는 않은 단계”

정도로 보인다.

그래도 틀린 이유를 스스로 찾고 수정했다는 점에서
이전보다 한 단계 올라온 느낌이다.