관리 메뉴

JIE0025

[악성코드분석] CodeEngn 코드엔진 Basic RCE L04 + 정상 띄우기 본문

기타 학습/보안

[악성코드분석] CodeEngn 코드엔진 Basic RCE L04 + 정상 띄우기

Kangjieun11 2020. 4. 17. 23:10
728x90

############## 작성자가 진행한 실습 그대로의 과정을 담았습니다. ##############

######## 공부 목적으로 실습한 것이라서 혼자 삽질한 내용이 담겨 있습니다. ########

 

 

오늘 실습할 것은 코드엔진의 Basic RCE L04이다. 

 

 

 

계속 해왔듯이 일단 파일을 올리디버거로 열어서 실행시켜보았다.

 

 

끝도 없이 :디버깅당함 이라는 문자열이 출력되었다. 

이를 보고 나는 두가지 생각이 들었다.

 

첫번째는 파일이 콘솔창에 뜨는 것을 보니 printf로 디버깅 당함을 출력하지 않을까 예상이 간것이며

두번째는 디버거를 탐지하는 함수가 약 1초에 한번씩 호출되는 듯 하였으니, 시간에 관한 함수도 존재할 것이라는 것이다.

 

그리고 이 두가지 생각이 

> C언어를 사용한 실행파일이겠구나, 그렇다면 1초에 한번씩이니까 내가 아는 지연 함수는 sleep 인데 이게 있지 않을까? 라는 생각으로 결론지었다.

 

ctrl + f2 를 눌러서 실행을 멈추고 처음으로 돌아가보았다.

 

 

 

시간에 관한 API 검색을 위해

오른쪽 마우스 클릭 >search for > all intermodular calls 를 클릭해보았다.

 

 

아래로 내리다보니 Time = 1000. ms 가 보였다. 

Sleep 을 보니 예상에 가까워 진것 같았다. 두번클릭해서 들어갔다

 

 

 

F2를 눌러서 breakpoint를 설정하였다. 

현재 들어와 있는 함수에 IsDebuggerPresent라는 함수를 CALL 하는 줄이 눈에 띈다. 얘가 정답인 것 같다.

얘 역시 breakpoint 설정을 해주어야겠다.

0040105에서 CALL되는 함수가 정답이 맞겠지만, 얘가 정말로 디버거 탐지하는 함수라면, true값으로 1을 return 할 것이라고 생각했다. 즉 함수를 나온 순간에 EAX값이 1일 것이라는 이야기이다. 

 

 

breakpoint를 잡았으니 ctrl + F2 , F9 를 눌러서 실행시킨 후 

0040105E를 f7로 들어가보고자 한다.

 

 

 JMP되어있으므로 한번더 들어갔다.

 

 

 

  위에서 예상한대로 retn전에 eax값이 1로 변경된것을 확인하였다.

 

 

 

다음은 디버깅당함이 어디서 호출이 되는지를 찾아보고자 한다. 

IsDebuggerPresent 이후에 TEST EAX EAX 를 통하여 값이 true인지 확인한다.

그 후 어떤 함수를 CALL 하는데, 어떤 OFFSET을 PUSH해주는 것을 볼 수 있다. PUSH까지 진행 해본 후에 HEX DUMP 값을 확인해보겠다. 나는 "디버깅 당함" 이라는 문자열이 들어가지 않을까 예측해보았다.

 

 

 

들어간 OFFSET 글씨 확인 후 <우클릭 > Follow in Dump 

 

 

 

16진수의 값들이 나왔다. 나는 이 것이 디버깅 당함이라고 예측하고 있기 때문에, 한글코드 변환기를 사용해서 디버깅당함을 16진수로 변환해 보았다.

 

 

예상 적중 !! ㅎㅎㅎㅎ

 

-------------------------------핑크 색 부분은 삽질입니다 -------------------------

그러면 CALL 00408190 에 들어가 봐야겠다.

한줄한줄 읽다가 PUSH EAX에서  아까 문자열 OFFSET인 00431024가는 것을 확인했다. PUSH EAS 아래의 004081E6 에서 CALL 하는 함수에서 문자열을 print해주리라! F7을 통해 들어가 보았다.  

 

 

 

그 후 쭉 디버깅을 해보다가 writeFile 이라는 함수를 찾았다. 얘 역시 들어가 봤다.

 

 

엄청난 삽질이었다. 76FC1DDC에 와서야 우리는 화면에 디버깅당함이 뜨는 것을 볼 수 있었다.

 

 

--------------------------------------------------------------------------------------------

 

삽질을 마치고.. 

그렇다면 디버깅당함을 어떻게 안나오게 할 수 있을까?

<<<<첫번째 방법>>>> 

TEST EAX EAX가 FALSE, 즉 0이 나오게 해본다. 

IsDebuggerPresent에서 값을 0을 return 하게 하면 될 것이다.

 

<<<실습 실패 여기 다시 해서 업데이트 할거임>>>

 

<<<<두번째 방법>>>>

PUSH 된 16진수 문자열OFFSET의 값 자체를 변경시켜준다. 

 

 

 

패치할 영역을 드래그 후 ctrl + E를 클릭하면 Edit할 수 있는 창이 뜬다.

 

 

한글코드 변환기로 정상을 변환시켜 값을 넣어준다.

 

 

 

 

 

ok 후  f9로 실행해보니 정상이 뜬다.

 

 

 

-------------------------

정답체크

 

 

 

 

 

 

 

오늘도 성공적 ~~~~!