본문 바로가기

드림핵 워게임

[드림핵/워게임] rev-basic-4

https://dreamhack.io/wargame/challenges/18/

 

앞선 문제들과 동일한 부분에 대한 설명은 생략하겠다.

빠르게 sub_140001000 함수를 살펴 보겠다.

 

 

(16 * str[i]) || (str[i] >> 4) 의 결과가 byte_140003000[i]의 값과 대응되어야 한다.

  • 16진수에 16을 곱하는 것은 << 4 연산과 결과가 같다.

 

따라서 해당 식은 (str[i] << 4) || (str[i] >> 4) == byte_140003000[i]와 같다.

입력이 0xA로 들어왔다고 가정해 보자.

 

0xA를 2진수로 표현하면 0000 1010이다.

0xA << 4 = 1010 0000

0xA >> 4 = 0000 0000

1010 0000 || 0000 0000 = 1010 0000

 

즉, 이 식은 처음 입력했던 문자열에 2진수에서 4비트끼리 앞뒤로 뒤집은 것이다!

따라서 이를 반대로 적용해서 풀어 주면 된다.

 

 

byte_140003000에는 다음과 같이 저장되어 있다.

 

 

연산의 결과는 다음과 같이 나오며, 이를 입력하면 Correct가 출력되는 것을 볼 수 있다.