[reversing.kr] Replace
Rev/reversing.kr

[reversing.kr] Replace

반응형
File Format : WINDOWS 32-bit

이전부터 리버싱 제대로 파일 분석해보고 싶었지만 그 시점에 딱 군대 오는 바람에 접었던 리버싱 다시 시작하려 한다.

안 그래도 큰 바이너리 분석 위해서는 조금씩 조작된 바이너리 보면서 익숙해진 다음 도전해보고 싶다는 생각은 가지고 있었다.

이번 문제부터 리버싱 계속 연습해보자.

 

🏒 Analyzing


Dynamic Analysis

뭔가를 입력할 수 있다. 참고로 문자는 안되고 only 숫자만 된다.

문제는 입력하고 나서 check 버튼을 누르면 그대로 꺼진다.

루틴 분석해서 어떻게 동작하는지 보도록 하자.

 

Static Analysis

먼저 에러나는 부분부터 어딘지 확인해봤다.

0x40466F 주소에서 넘어가질 않는다.

[eax] = 0x90 을 하려고 하는데 현재 eax에 저장된 값의 주소는 access가 안된다고 뜬다.

여러 번 input을 바꿔 시도해보면 eax에 담기는 값이 달라지는 것을 볼 수 있다.

input을 이용한 계산 루틴을 찾기 위해 값을 입력하는 함수인 GetDlgItemInt를 기준으로 한 줄씩 실행해봤다.

 

위의 사진을 그래프로 보면,

0x40466f를 많이 부른다. 루틴을 보자.

 

0x40466f 루틴

0x4084d0에는 사용자가 입력한 숫자가 저장된다.

다시 0x40467a를 부른다.

▶ 0x40467a 루틴

1. 0x406016 = 0x619060EB 

2. call sub_404689로 0x404689를 함수로 부름

3. 0x4084D0 (input) += 1

4. ret한 후에 다시 0x404689 진입해서 0x4084D0 (input) += 1

5. ret 하니 0x40466F 다음인 0x404674로 감.

> 이번 루틴에서는 사용자 입력한 값에 +2를 한 결과가 됐다.

0x404674 루틴

사용자 입력에 0x601605C7을 더한다.

그리고 계속 가면 다시 아래와 같은 상태로 온다.

그럼 사용자 입력에 다시 +2가 된다.

이후 여기로 오는데 0x404690으로 간다.

여기서 중요한 점이 0x40466F의 값을 0xC39000C6으로 바꾸고 해당 주소를 호출한다.

이는 즉 어셈블리어 명령을 REPLACE하고 call 한다는 것이다. 문제 제목의 의미가 여기서 나온다.

가보면 다음과 같이 바뀌어있다.

eax에 저장된 곳에 NOP 어셈블리어 명령어를 삽입한다.

다시 리턴하면 eax + 1에 다시 NOP를 삽입하도록 한다.

정리하자면 eax로 나오는 주소와 다음 1Byte를 NOP로 바꿔 무력화시킬 수 있다는 걸 의미한다.

이제 그렇게 write되는 주소에 잘 써놨다면 0x401071로 간다.

위에서 써놨던 루틴의 시작 주소인 0x40106C가 보인다. 바로 다음 명령어로 점프한다.

그런데 'Correct' 문자열이 나올 수 있도록 하려면 0x401071의 2Byte가 없어져야 가능하다.

여기서 우리는 입력값을 통해 eax의 값이 0x401071가 나오게 해서 해당 점프문을 없애야 한다는 걸 알 수 있다.

 

x32dbg 계산기로 계산해보면 

2687109798이라는 값을 입력하면 될 것 같다.


flag: 2687109798

반응형