일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- C++
- 코딩교육봉사
- programmers
- 백준
- 코틀린
- 문제풀이
- python
- 백준 알고리즘
- 자바
- java
- 공부일지
- 프로그래머스
- BFS
- 데이터베이스
- 소프티어
- 회고
- SW봉사
- 정보처리산업기사
- 스프링
- 코딩봉사
- 1과목
- CJ UNIT
- SQL
- softeer
- MYSQL
- kotlin
- 백준알고리즘
- 알고리즘
- 시나공
- 파이썬
- Today
- Total
JIE0025
[악성코드분석] CodeEngn 코드엔진 Basic RCE L04 + 정상 띄우기 본문
############## 작성자가 진행한 실습 그대로의 과정을 담았습니다. ##############
######## 공부 목적으로 실습한 것이라서 혼자 삽질한 내용이 담겨 있습니다. ########
오늘 실습할 것은 코드엔진의 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로 실행해보니 정상이 뜬다.
-------------------------
정답체크
오늘도 성공적 ~~~~!
'기타 학습 > 보안' 카테고리의 다른 글
DLL(Dynamic Linked Library) 이란? (0) | 2020.06.07 |
---|---|
[악성코드분석] CodeEngn 코드엔진 Basic RCE L05 (0) | 2020.04.19 |
[악성코드분석] CodeEngn 코드엔진 Basic RCE L03 + 추가 분석 (0) | 2020.04.11 |
[악성코드분석] CodeEngn 코드엔진 Basic RCE L02 (0) | 2020.04.11 |
[악성코드분석] 문자열 패치 실습 (0) | 2020.03.30 |