Writeup

[Dreamhack] 리버싱 rev-basic-3 Writeup

이둥둥 2025. 2. 20. 21:48

 

IDA에 실행파일을 로드해서 흐름을 살펴보면

Input: 여기서 인풋을 받고 검증을 통해 correct, wrong을 출력한다

 

Correct를 출력하는 조건이 뭔지 loc_140001193을 살펴보자

 

sub_140001000에서 인풋을 비교한다

더블클릭해서 들어가니까 수식이 있다

 

일단 byte_140003000에 hex 값으로 힌트를 찾을 수 있는지 보면

 

 

뭔가 hex 값이 있긴 한데 플래그로 보이는 문자는 아닌 것 같다

위에 나온 수식이 유일한 해결책인 것 같아서 다시 분석해 보겠음

 

arr[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i

 

hex_value값을 이미 알고 있으니까 역으로 연산하는 식을 구하면 되겠다

arr[i] != (i ^ a1[i]) + 2 * i
arr[i] = (i ^ a1[i]) + 2 * i
arr[i]-2 * i = (i ^ a1[i])
a1[i]=(arr[i]-2 * i)^i

 

arr = [73, 96, 103, 116, 99, 103, 66, 102, 128, 120, 105, 105, 123, 153, 109, 136, 104, 148, 159, 141, 77, 165, 157, 69]

for i in range(24):
    print(chr((arr[i] - 2 * i) ^ i), end="")

 

이거 코드 짜느라 30분 넘게 걸린 듯..ㅎㅎ

결과적으로 성공!

 

 

내가 리버싱 하면서 이런 말을 하게 될 줄은 몰랐는데..

꽤 재밌는 것 같다