CTF & Wargame(REVERSING)

[dreamhack] level 2 ezmix

KWAKBUMJUN 2025. 2. 25. 00:23

바이너리 분석

main 파일 실행 화면

문제에서 제공하는 main 파일을 실행해보니 위와 같은 문자가 출력이 됐다. 뭔지 모르겠으니 한번 ida로 찾아보자.

 

IDA 분석

main 함수 디컴파일

main 함수를 디컴파일하여 c 코드를 살펴보면 위와 같은 코드를 확인할 수 있다. 위의 코드를 보니 a1이라는 값이 2보다 작거나 같으면 아까 봤던 문자열을 출력하고 프로그램을 종료 시킨다는 것을 알 수 있다. a2가 대체 어디서 나온 값인지 궁금해서 코드를 살펴보니 main 함수의 파라미터였다. 그렇다는건 main 파일을 실행할때 파라미터를 넘겨줘야 한다는 뜻같다.

 

그래서 한번 하라는대로 입력해봤는데 뭔가가 됐다. 특정 문자열을 입력할 수 있는데 이 문자열을 찾으면 flag를 찾을 수 있는 문제로 보인다.

한번 ida로 계속 분석해보자.

 

다시 올라가서 main 함수를 디컴파일한 코드를 보면

main 함수 디컴파일

1. a2[1]에 해당하는 바이너리를 열고 r 모드로 파일을 읽는다. 그리고 a2[1]의 파일 포인터를 stream에 저장한다.

2. stream에 저장된 바이너리를 읽고 최대 0x400 바이트만큼 1바이트씩 읽는다. 또한 데이터를 ptr에 저장한다. 그리고 읽은 바이트 수를 v5에 저장한다.

3. sub_136C 함수를 호출한다. 사용자가 입력한 문자열은 s에 저장된다.

4. a2[2] 바이너리를 wb모드로 열고 streama에 a2[2]의 파일 바이너리를 저장한다.

5. v3에는 사용자가 입력한 문자열의 길이를 저장한다.

6. streama 파일에 s의 값을 0x01 바이트만큼 v3씩 write 한다.

7. streama 종료

핵심 : 인자를 ./main program.bin output.bin 이렇게 입력했을 때, 해당 코드의 핵심은 사용자가 입력한 값을 output.bin에 저장한다는 것이다.

 

sub_136C 함수 분석

sub_136C 함수 디컴파일 사진

파라미터 : ptr, v5, s

ptr : fread가 stream에서 읽은 데이터를 저장한 변수

v5 : fread의 반환값인 실제로 stream 파일에서 읽은 데이터의 수

s : 사용자의 입력값

 

위의 함수는 만약 v3가 4라면 사용자 입력을 받고, 그게 아니라면 라벨12로 가거나 case3, case1, case2를 실행한다. 

 

sub_1301 함수 분석

sub_1301 함수 디컴파일 코드

위의 코드에선 sub_12C2, v6, a3, v7을 각각 인자로 둔다. 그리고 1바이트씩 읽고, i의 값이 v7보다 크거나 같다면 반복문을 멈춘다. 그리고 다른 경우에는 break문 아래에 있는 연산을 수행한다. 

 

sub_12C2  함수 분석

sub_12C2 디컴파일 코드

비트 쉬프트 연산을 수행

 

sub_1289 함수 분석

sub_1289 다컴파일 코드

덧셈 연산 수행

 

sub_12A7 함수 분석

sub_12A7 디컴파일 코드

xor 연산 수행

 

모른다 포기