Dreamhack(reversing) rev-basic-3

oolongeya

·

2021. 9. 12. 19:01

개인적으로 Dreamhack의 reversing 문제의 basic 파트 부분의 앞부분은 쉽다고 생각한다.

하지만 3번은 입문자에게 쉬운 난이도가 아니어서 풀어볼 것이다.

 

 

x64디버거로 실행시키면 input 값을 받는다.

 

IDA를 이용하면 main 부분을 좀 더 직관적으로 알아볼 수 있다.

 

main 함수를 확인해보자.

 

디스어셈블 하면 친숙한 그림이 보일 것이다.

 

Input 값을 v4에 저장하고 v4 값을 sub_140001000 함수에 실행해서 나오 값이 참이라면 Correct를 거짓이라면 Wrong을 출력한다.

 

그럼 이제 sub_140001000 함수를 살펴보자

0x18 = 24 번의 반복을 실행하는데, byte_140003000의 배열에 원소를 하나씩 비교하는 것 같다.

즉 함수(아규먼트1)로 실행하면,

 

byte_14003000[i] != (i ^ (아규먼트1 + i)  + 2 * i) 의 역연산을 취하면 flag 를 얻을 수 있다.

 

그럼 이제 byte 배열의 값을 확인해보자

unsigned char 형 32개의 배열이다. 처음 접하는 경우 아래의 표를 참고하자

https://docs.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=msvc-160 

 

데이터 형식 범위

자세한 정보: 데이터 형식 범위

docs.microsoft.com

 

 

 

49h, 60h ... 등인데 24개 까지 비교하니 24개를 16진수 형태로 가져와보자.

계산기의 프로그래머 기능을 이용해도 좋다.

 

73, 96, 103, 116, 

99, 103, 66, 102, 

128, 120, 105, 105, 

123, 153, 109, 136, 

104, 148, 159, 141, 

77, 165, 157, 69

 

24개를 확인했다. 이제 역연산이 남았다.

 

연산해서 해준 순서를 반대로 하면 된다!

 

DH{I_am_X0_xo_Xor_eXcit1ng} 가 플래그다.

반응형