Reversing/드림핵(dreamhack)

rev-basic-1 LEVEL 1

Roronoa 2022. 10. 21. 20:33
반응형

1. 문제 정보

1.1 문제 이름

rev-basic-1 (dreamhack)

1.2 문제 설명

[그림 1] 문제 설명

문제를 실행하면 문자열을 받도록 되어있다. 문자열을 넣었을 때 프로그램 내부에서 검증을 거쳐 검증이 통과하면 Correct 통과하지 못하면 Worng을 출력한다.

1.3 문제 분야

◼️ 리버싱

2. 풀이

2.1 정적 분석

[그림 2] 문자열 찾기

Shift + f12를 눌러 문자열을 검색하였다.

'Input :', 'Correct', 'Wrong' 등 다양한 문자열이 존재를 한다. 검증부분이 통과할 때 Correct 부분이 출력될 것이므로 이 부분을 분석하겠다. 더블클릭으로 Correct 부분에 접근하고 x를 통해 문자열이 호출하는 함수로 접근을 하였다.

 

[그림 3] 디컴파일된 메인 함수

먼저 sub_1400013E0와 sub_140001440 함수를 먼저 분석해 보겠다.

 

[그림 4] sub_1400013E0 함수

_acrt_iob_func의 인자가 1이므로 stdout 스트림을 가져오고 stdout 스트림을 sub_1400012B0 함수로 전달을 한다.

sub_1400012B0 함수의 내부를 보면 _stdio_common_vfprintf를 리턴을 한다. 따라서 sub_1400013E0 함수는 printf 함수임을 유추할 수 있다.

단축키 n을 눌러 함수의 이름을 printf로 변환을 한다.

 

[그림 5] sub_140001440 함수

_acrt_iob_func의 인자가 0이므로 stdin스트림을 가져오고 stdin 스트림을 sub_140001300 함수로 전달을 한다.

sub_140001300 함수의 내부를 살펴보면 _stdio_common_vfscanf를 리턴을 한다. 따라서 sub_140001440 함수는 scanf 함수임을 유추할 수 있다.

이 함수 또한 scanf로 변환을 한다.

 

[그림 6] 함수 이름 변경

그림 6은 함수이름을 변경한 main함수의 모습이다. 나머지 함수를 보면 sub_140001000 함수가 입력값을 검증하는 함수임을 예측할 수 있다.

 

[그림 7] sub_140001000 함수

a1은 우리가 입력한 값이고 입력한 값 1바이트마다 검증하고 있다.

마지막에는 숫자 0을 넣어주고 리턴을 한다. 단축키 r을 사용하여 숫자를 아스키코드에 대응하는 문자로 바꿀 수 있다.

 

[그림 8] 문자로 변환

이 소스코드를 보면 a1은 Compar3_the_ch4ract3r이 되어야지 Correct를 출력한다는 것을 알 수 있다.

따라서 답은 Compar3_the_ch4ract3r이다.

 

[그림 9] flag 값

 

반응형

'Reversing > 드림핵(dreamhack)' 카테고리의 다른 글

rev-basic-0 LEVEL 1  (0) 2022.10.20
HelloWorld 분석  (0) 2022.10.17