CTF/CODEENGINE

CodeEngine_Basic #1

종금 2020. 2. 22. 21:15
반응형

 

 

매번 악성코드분석 해봐야지 해봐야지 하다가 이런저런 핑계되며 못했는데

이번 스터디에서 악성코드 분석하기로해서 스터디 핑계되고 드디어 리버싱 시작한다.

일단 악코 분석을 위한 리버싱으로 코드엔진에서 나온 문제들을 풀기로했고

베이직부터 하나하나 풀어보도록하자.

(hacker factory는 언제다하려나)

 

일단 코드엔진 들어가서 Basic 1번 문제를 살펴보면 다음과 같다.

 

Author abex에 CD-ROM 보니 처음 리버싱 배운다고 abex-crackme 생각났는데 그문제더라...


일단 받아서 압푹을 풀어보니 01.exe 파일이 있다.

이 프로그램을 시작하면 

두개의 창을 보여주고 끝난다.

어떤 방식으로 작동하지는 보기 위해 올리디버거로 실행해서 보면 다음과 같이 세부분의 메시지 박스로 구분할 수 있었다.

 

첫번째 메시지 박스는 실행하자마자 보이는 CD-ROM 있다고 생각하도록 해봐

두번째는 에러메시지로 실패함을

마지막 세번쨰는 성공메시지로 보인다.

 

일단 첫번째 메시지까지는 무조건 똑같을 테니 끝나는 부분에 브레이크 포인트를 주고 하나씩 넘겨보도록 하면

F2로 브레이크를 주고 F11로 넘겨보자

여기까지 오고나서 바로 에러 메시지로 넘어간다. 즉 이부분에서 선택하고 넘어가는거 같은데

읽어보니 JE SHORT 01.0040103D이다.

0040103D를 읽어보니 성공했을 때의 메시지이다.

 

물론 여기서 저거를 조건 맞게해서 넘길 수도 있겠지만

그것보다 그냥 JMP를 사용해서 해결해보도록 하자

일단 아까 에러메시지로 가기전 분기문인 0041026 주소에서 수정을 하도록 하고

 

JE를 무조건 주소로 넘기는 JMP로 변경하여 실행하니

이렇게 CD-ROM이 있다고 인식한다고 하며 끝난다.

 

 

일단 여기서 JE를 JMP로 바꾸며 끝났지만 여기서 JE가 무엇이고 JMP가 무엇인지 모르면 풀수 없는 문제였다.

먼저 이 문제에 나온 JE는 Jump if Equal로 

점프를 시키는데 참일때 JMP를 한다이다.

여기서 보면 JMP SHORT 01. 0040103D가 있는데. 01에 대해 참이면 03D로 분기시킨다는 것이다.

즉 지금 상태가 FALSE이기에 바로 다음줄로 분기되어 오류메시지를 출력한다.

 

그럼 출제자가 원하는 것은 뭘까? 둘중 하나이다. JE를 트루로 만들어서 3D로 보내 만들거나

아니면 if문을 if not문으로 만들어서 분기문이 참이되도록 하는 것이다.

 

먼저 if not이 쉬울테니 if not으로한다할떄 JE의 반대는 JNE(Jump not equal)로 

해보지 않았지만 JNE short 01.뭐시기로 바꾸어도 저거는 풀렸을 것이다.

왜냐? 무조건 False되고 이는 저기로 보낼테니까

 

두번째는 참으로 만드는 것인데 바로 위를 보면 CMP로 EAX와 ESI를 비교하는 것을 볼 수 있다.

분기문을 다시 클릭해서 보면 EAX는 0019FFCC이고 ESI는 00401000이다. 

그럼 여기서 위 INC나 DEC등을 조절하여 만들 수도 있고 CMP를 EAX, EAX나 ESI, ESI로 하더라도 풀수 있을 것이다.

 

 

그럼 두가지 방법을 하나씩 보자

 

먼저 JNE로 바꾸면 

 

두번째로 CMP를 같게 하는 방법

 

 

하지만 쉽게 JMP를 쓰면 묻지도 따지지도 않고 원하는 곳으로 보낼 수 있으니 그렇게 푼걸로 하자

 

그럼 이제 저기 보이는 J로시작하는 Jump에 대해 정리해보자

 

1.JMP

먼저 JMP는 묻지도 따지지도 않고 뒤에 주소로 보내는 것을 의미한다.

JMP SHORT 0104112라면 묻지도 따지지도 않고 0104112 주소로 보내준다.

 

2. JE(JZ)

JE는 Jump if Equal(Zero)의 준말로서 위에 CMP(Compare) 함수가 같다면 해당 주소로 보내는 것이다

Zero의 경우 Flag가 0으로 CMP가 같다면 Flag는 0로 수렴하기에 결국 JE나 JZ나 같다.

위에서 EAX와 ESI가 다른값이기에 FALSE가 되는데 이때 둘을 같게 하기 위해 EAX EAX해서 비교한것으로 해결했다.

(내가 나자신과 같지 누구랑 같겠느냐)

 

3. JNE(JNZ) 

JE에서 NOT을 붙인 어셈블리 어이다. Jum if not equal(zero)로 위 CMP 함수가 서로 다르다면 

보낸다. 위의 경우 EAX와 ESI가 다르기에 JNZ일경우 True이다.

 

4. JG

JG는 Jump if Greater로 왼쪽이 더큰 >의 함수이다. 중요한건 왼쪽이다

만약 JG EAX, ESI가 있을때

EAX가 100이고 ESI가 10이라면 이는 True이지만

EAX가 10이고 ESI가 100이라면 False로 수렴한다.

 

5. JGE

JG에서 한칸 더 진행되 Eqaul까지이다.

이때 Eqaul은 or로서 크거나 같으면이다

즉 JG과 JE 둘 중 하나라도 True가 된다면 해당 주소로 Jump한다.

반응형