해당문제의 바이너리를 실행하면 crc체크에 걸려서 exe corrupted이라는 문자열을 출력한다.

 

 

에러 문자열 상단의 crc 체크를 진행하는 함수 내부를 진행해보면 다음과 같은 반복문이 나온다.

 

 

해당 코드에 대해 분석해보면 CALL AHK2.00458C2D 함수를 통해 파일의 처음부터 1바이트씩 값을 가져와 이 값을 토대로 CALL AHK2.00450F95 함수에서 crc 체크섬값을 만든다. 이 때 반복문이 탈출하는 값이 아래와 같이 32A1F란 값인데 이 값이 파일의 전체크기인가하고 헥스에디터로 열어서 확인하니 마지막 4바이트값은 포함이 안되있는걸 볼 수 있었다. 

 

 

 

왜 마지막 4바이트값은 포함이 안되었을까 생각해보다가 일단 넘어가서 이후로직을 분석하기 위해 구해진 체크섬값과 AAAAAAAA를 xor한 값을 통해 최종적으로 구한 값을 EBP-10영역의 값과 비교할 때 그 이유를 알게되었다. EBP-10의 값을 보면 39A64194라는 값이 존재하는데 이전의 체크섬 계산시 사용하지 않았던 파일의 마지막 4바이트값이었다.

 

 

여기까지 분석한 후 이 값만 맞춰주면되겠다 생각하고 EBP-10영역의 값을 522D85D4로 맞춰 JNZ에서 점프하지 않도록 진행하면 끝이겠거니 했는데 그대로 exe corrupted가 발생하는걸 보니 이후로직도 분석이 필요한 것 같았다.

 

 

해당부분은 처음에 계속 분석해봐도 감이 잡히지 않아 AHK1의 해당영역과 AHK2의 해당영역을 비교하면서 분석해봤다. 그 결과 정상적인 흐름으로 진행되려면 [EBP+EAX-34]의 16바이트 값과 [EBP+EAX-24]의 16바이트 값이 동일해야 했고 [EBP+EAX-24] 영역의 16바이트 값은 AHK1와 AHK2가 동일하게 박혀있었는데 [EBP+EAX-34] 값을 AHK2에서 가져오지 못하는걸 볼 수 있었다.

처음엔 CALL AHK2.00458D16 , CALL AHK2.00458C2D 함수를 분석하지 않고 적당히 flag변조해서 00450A04주소의 반복문으로 진입해 [EBP+EAX-34] 영역에 비교하는 값을 강제로 삽입하고 진행해봤는데 역시나 exe corrupted 메시지가 발생하였다.

어쩔 수 없이 위의 두 함수를 분석해본 결과 첫 CALL AHK2.00458D16 함수 호출 시 AHK1과 달리 AHK2에서 다음과 같은 에러가 발생하는걸 볼 수 있었고 해당 에러에 대해 찾아보니 SetFilePointer 함수 호출 시 새로운 파일 포인터 위치가 음수일 경우 발생하는 에러인걸 알 수 있었다. 참고(http://nimto.tistory.com/574)

 

 

CALL AHK2.00458D16 함수가 SetFilePointer과 같은 역할을 하는 함수라 추측했고 함수인자를 확인해보니 두번째 인자인 파일포인터를 옮길 지점의 값이 파일의 전체크기보다 훨씬 큰 값으로 세팅되어있는걸 볼 수 있었다.      

 

 

이 값때문에 일단 에러가 발생한거라고 생각했고 AHK1에서 이 값이 어떻게 들어가는지 확인해보니 32800이란 값이 들어가고 있는걸 확인할 수 있었다. 이후 DC9A8390을 일단 32800으로 변경하여 함수를 호출해보니 에러가 발생하지 않았고 이후 함수인 CALL AHK2.00458C2D 호출 후 871a80영역에 정상적으로 871a90영역과 동일한 값이 세팅되는걸 볼 수 있었다. 세팅된 값을 어떻게 가져오는거지하고 몇번 더 트레이싱해본결과  CALL AHK2.00458D16 함수를 통해 파일 포인터를 새로 지정한 뒤 해당 파일 포인터를 기준으로 CALL AHK2.00458C2D 함수를 호출하여 16바이트값을 가져와 871a80 영역에 저장하고 871a90의 값과 비교하는 형태인 것 같았다.

여기까지 진행하고 실행해보면 다음과 같이 문제가 나왔고 이 문제의 답을 구글링하면 정답을 구할 수 있었다.

 

 

문제를 풀면서 느낀점은 기본실력이 너무 부족하다는 것이었다. AHK1과 비교하면서 어찌어찌 풀긴했지만 문제자체를 완벽히 이해하지 못하고 풀었다는 생각이 들고 AHK1과 비교하지 않고 AHK2 바이너리만 가지고 풀었다면 과연 풀 수 있었을까 라는 생각이 들었다. 반성할 부분이 많고 더 열심히 공부해서 실력을 꾸준히 늘린 후에 다시한번 풀어보면서 그때는 완벽히 문제를 이해하고 풀어보도록 하겠다.

 

 

 

 

 

   

 

 

 

 

 

 

'Wargame > reversing.kr' 카테고리의 다른 글

reversing.kr HateIntel  (0) 2018.07.03
reversing.kr PEPassword  (0) 2018.07.03
reversing.kr AutoHotkey1  (0) 2018.06.29
Reversing.kr Twist1  (0) 2018.02.27
Reversing.kr Easy_ELF  (0) 2018.02.17
블로그 이미지

JeonYoungSin

메모 기록용 공간

,