CodeEngn Challenges : Basic 01 문제 풀이
반응형

안녕하세요.


테라트입니다.


오늘은 코드엔진, 리버싱을 처음하는 단계에서 리버싱을 연습할 수 있는 사이트에서 제공해주는 Basic 1번 문제를 풀이하려고 합니다.


사이트 : https://codeengn.com/challenges


여기에 접속하시면



다음과 같은 화면이 보이실 텐데, 여기서 저희는 Basic RCE Level01 을 해보도록 하겠습니다.


저는 이전에 올리디버거 설치 때와 마찬가지로 가상에서 분석을 진행하도록 하겠습니다.


Level01을 누르시면 문제와 샘플 파일이 보이실겁니다. 확인해보겠습니다.


사용하시는 브라우저에 따라, 또는 옵션에 따라 다음과 같은 화면이 보이실 수도 있고, 다른 형식으로 보이실수도 있을텐데요,



저같은 경우에는 크롬을 사용하며, 위험으로부터 사용자를 보호한다는 옵션이 활성화 되어있어 이렇게 표시 됩니다.


접속하는 방법은 세부정보- 이 사이트를 방문 을 클릭하시면 되겠습니다.


그럼 다음과 같은 화면이 소개됩니다.


문제가,, HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되야 하는지 묻고 있네요.


일단 실행해봅니다.


이 파일은 악성행위가 없는 파일이지만, 악성행위가 있는 파일을 사용하시는 본 PC에서 돌리실 경우 감염이 될 수 있습니다.


그래서 알 수 없는 파일이나, 악성파일로 의심되는 경우에는 가상환경에서 돌려보는 방법을 추천합니다.


가상환경을 구축하는 방법은 조만간 작성하겠습니다.



악성코드 분석에는 크게 두가지 방법으로 나뉘는데,

가상환경에서 악성코드를 직접 실행함으로써 어떤 행위를 하는지 파악하는 방법을 동적분석이라고 합니다.

올리디버거, IDA 등의 프로그램을 사용하여 프로그램을 직접 실행시키지 않고 어떤 행위를 하는지 파악하는 방법을 정적분석이라고 합니다.


저희는 오늘 동적분석과 정적분석 두가지를 모두 실습해보도록 하겠습니다.


샘플파일 다운로드는 위에 보이시는 파란색 Download 글씨를 통해 받으실 수 있습니다.


받은 압축파일을 해제하면 .exe 파일이 나오게 됩니다.


악성파일은 확장자 또한 변경되어서 배포될 수 있기 때문에 단순히 확장자만 봐서 판단해서는 안됩니다.


추후에 PE 헤더에 대해 소개하면서 파일의 숨겨진 확장자를 알아보는 방법 또한 작성하도록 하겠습니다.


일단 이 파일은 .exe 형식으로 되어있으며 실행을 시켜보겠습니다.


문제와 동일한 이야기를 하고 있군요 OK 누르게 되면



다음과 같이 CD-Rom이 아니라는 경고를 하고 프로그램을 종료하고 있습니다.


자 이제 정적분석을 시작해보도록 하겠습니다.



올리디버거로 실행시킬 시에 표시되는 가장 처음 화면입니다.



위의 사진에 빨간색 박스로 표시되어 있는 부분 보이시나요?


이는 그 주소 부분에 대한 설명으로서 저희가 분석하는데 있어서 더 쉽게 알아볼 수 있도록 해줍니다.


올리디버거 기본적인 사용방법에 대해서 잠시만 소개하도록 하겠습니다.


- Ctrl + F2 : 재시작

- F2 : 브레이크 포인트 설정

- F7 : 다음 단계로 실행(함수내부로 들어감)

- F8 : 다음 단계로 실행(함수내부로 들어가지 않음)

- F9 : 브레이크 포인트 있는 곳까지 실행


위의 사항중에 함수 내부로 들어간다 들어가지 않는다가 어떤 이야기인지 헷갈리시는 분들을 위해 추가 설명을 하자면,

F7을 누를 경우에는 CALL 또는  JMP 문에서 다른 주소 영역으로 이동되는 것이 발생할 경우에 그것을 따라가서 분석을 할 것인지 아니면 건너뛰고 분석을 할 것인지를 의미합니다.


저희는 아직 기초단계이고 처음 리버싱을 시작하는 마음으로 하고 있기 때문에 함수에는 들어가지 않고 문제를 풀어보도록 하겠습니다.


F8을 이용해 디버깅을 진행하도록 하겠습니다.

CALL문 위에 PUSH가 되는 것은 CALL, 즉 함수를 호출하기 전 인자값으로 사용되는 값들 입니다.



F8을 이용해 함수를 진행하다보면 익숙한 문구가 보이실 겁니다. 처음에 동적분석을 할 때에 보았던 문구가 보이시는 것을 확인할 수 있습니다.


그렇다면 여기서 처음 CALL <JMP.&USER32.MessageBoxA> 이부분은 처음에 저희가 보았던 문구를 화면에 출력해주는 역할을 하는 함수라는 것을 추측할 수 있습니다.


계속 다음으로 가보겠습니다.


그럼 위에서 예측한 대로, 실제 CALL 하는 부분에서 메시지 박스가 출력되는 것을 확인할 수 있습니다. OK누르고 F8을 눌러 다음으로 진행해보겠습니다.



계속 진행 하다보면 아까 보았던 오류 메시지를 볼 수 있습니다. 저희가 동적분석에서 확인하기로는 이 메시지를 OK 누르면 프로그램이 종료되었었죠?


그럼 문제 해결은 첫번째 MessageBox와 두번째 MessageBox 사이에서 처리를 해줘야 한다는 것을 알 수 있습니다.


잘 살펴보니 밑에 세번째 MessageBox가 보이는 것을 확인 하실 수 있습니다.


보겠습니다.



세번째 MessageBox의 텍스트 부분을 확인해 보니, OK, 너의 HDD가 CD-ROM인지 알겠다 라는 뜻의 메시지를 출력하고 있군요 그럼


첫번째 MessageBox와 두번째 MessageBox 사이에서 JMP문이 있다면 그 JMP문이 세번째 MessageBox의 주소를 향하게 해주면 되겠다는 결론이 나오게 됩니다.


Ctrl + F2를 통해 초기화를 시켜주고 확인해보겠습니다.



첫번째 JMP문이 나왔습니다. 근데 이 JMP문은 바로 밑으로 JMP를 수행하고 있는 것으로 보아 영향을 주지 않습니다.


두번째 JMP문으로 JE문이 나왔군요


JE문은 앞서 설명했습니다.

참고 링크 : http://qufdln.tistory.com/5 


모르는 내용 혹은 이해 안가는 내용 있으시면 댓글 바랍니다 ㅎㅎ

(저도 공부하는 입장이다보니 답변이 부족할 수 있음을 미리 알려드립니다..)


JE문이 향하는 주소값을 보니, 세번째 MessageBox로 가는 JMP문임을 알 수 있습니다.


그렇다면 저는 방법이 3가지가 보입니다.


1. JE를 조건문 JMP가 아닌 그냥 JMP문으로 변경한다.

2. 위에서의 CMP 함수의 값이 0 즉, Z 플래그가 1이 되도록 한다.

3. 그냥 Z 플래그 값을 1로 바꿔준다.


한가지씩 해보겠습니다.


1. JE문을 그냥 JMP문으로 변경한다.



JE문을 더블클릭 하시면 다음과 같이 수정하는 창이 발생하게 됩니다.

그냥 JE를 JMP로 바꿨씁니다. Assemble을 누르신 다음 F8로 실행해보겠습니다.



다음과 같이 정상적으로 출력되는 것을 확인할 수 있습니다. ㅎㅎ


다음 방법을 해보도록 하죠


2. 위에서의 CMP 함수의 값이 0 즉, Z 플래그가 1이 되도록 한다.

CMP가 EAX와 ESI를 비교하는데,

EAX는 1 이지만, ESI의 값을 2번 증가시켜서 2가 되어서 일치하지 않게 되서 Z 플래그가 0이 되는겁니다. 


저는 ESI 증가시키는 함수 1개를 없애보겠습니다.


저는 다음과 같이 INC 되는 부분을 그냥 NOP, 즉 아무실행도 하지 않고 넘어가게 수정하였습니다. 진행해보도록 하겠습니다.



짝짝짝 또 성공했네요. 다음 방법도 해보겠습니다.


3. 그냥 Z 플래그 값을 1로 바꿔준다.


이 방법은 여러분께 올리디버거에서 플래그를 쉽게 변경할 수 있는 방법이 있음을 알려드리려고 작성해봤습니다.


초기화를 시키고 JE문 전까지 수행을 하겠습니다.



CMP 문까지 수행하고 나면 Z 플래그의 값이 0 인것을 확인할 수 있습니다.


Z 플래그의 값을 더블클릭 하시면 값의 변경이 가능합니다.


이렇게 바꿔보도록 하겠습니다.


후에 실행을 하시면 결과는 이전과 같게 나옴을 알 수 있습니다.



많은 양의 제 글을 읽어주셔서 감사합니다.


다시 한 번 더 말씀 드리지만 저도 공부하는 입장입니다. 열심히 잘 정리해보도록 할테니 많이 봐주시면 감사하겠습니다. ㅎㅎ


다음에 다시 뵙겠습니다. 테라트였습니다.

반응형

댓글,

테라트

Since 2018.07.03 / IT 관련 정보, 일상의 공유를 위한 블로그