실행 시
또 메시지가 뜬다. Nags를 제거하기 위해 patch하라고 한다
또 또 또

 

OllyDBG를 실행한 결과

코드도 몇 줄 안되지만,, 실행하다보면 CMP EAX,0 가 뜬금없이 나온다.

EAX에는 실행 파일의 시그니처 값 MZ가 들어있다. 이는 DOS HEADER의 시작이며

이값은 절대 0일 수가 없다. (JE에서 점프가 불가능)

 

 

따라서 Entry Point를 401000에서 401024로 바꿔줘야 한다.

Memory Map에서 시작주소 400000번지의 PE Header 클릭
EntryPoint를 찾은 후 해당 값이 있는 주소(004000E8) 확인
덤프창에서 해당 주소로 가서 값 확인
00 10 00 00 을 24 10 00 00 으로 변경

원래 프로그램 시작점은 401000 이었지만, (Image Base 값 400000 + Entry Point 값 1000)

우리가 가고자 하는 401024로 가기 위해 4000E8의 값을 00에서 24로 변경해준다.

 

 

덤프창에서 먼저 Copy to executable file로 저장한 후, 실행하면 

요 아이가 또 뜬다

 

따라서 새롭게 저장한 파일을 OllyDBG에 다시 올려준 후 수정작업을 한다.

두번째로 뜨는 MessageBox를 삭제하기 위해서 NOP로 채워준다.

Copy to executable file - selection - save file
성공

'Study > Reversing' 카테고리의 다른 글

악성코드 주요 행위 분석  (0) 2021.11.10
고급 정적 분석 by IDA  (0) 2021.11.10
악성코드 분석  (0) 2021.11.03
Lena 2번 풀이/Rena's Reversing Tutorial 02  (0) 2021.10.27
윈도우 실행 파일과 패커  (0) 2021.10.06

기초 정적 분석 → 기초 동적 분석 → 고급 정적 분석 → 고급 동적 분석

 

기초 정적 분석

프로그램 기능 파악 (코드나 프로그램의 구조 분석)

 

① 악성 여부 판단 by VirusTotal

 

② 악성코드 판별 해시 사용 (악성코드 ID) by MD5 & SHA1

: 해시를 이름으로 사용, 악성코드 식별을 위해 해시 공유, 식별 여부를 위해 해시 검색

 

③ 파일의 문자열, 함수, 헤더에서 개략적 판단 by strings

: 프로그램 메세지 출력, URL 접속, 특정 위치로 파일 복사 등을 확인

 

④ 패킹 여부 확인 by PEiD

: 패킹 여부 확인하고 언패킹하여 리버싱을 보다 쉽게 하기 위한 단계

 

⑤ PE 세부 구조 확인 by PEview

: Size of Raw Data(원래 데이터 크기)보다 Virtual Size(가상 크기)가 월등히 크다면 다른 파일을 올리기 위함으로 의심해 볼 수 있음, 섹션의 이름 변경 여부를 확인

 

⑥ DLL 의존성 조사 by Dependency Walker

- Kernel32.dll : 메모리, 파일 ,하드웨어 접근과 조작

- Ntdll.dll : 윈도우 커널 인터페이스

- Advapi32.dll : 서비스 관리자, 레지스트리 같은 추가 윈도우 핵심 컴포넌트

- User32.dll : 유저 인터페이스(버튼, 스크롤바, 사용자 행위 제어, 반응 컴포넌트)

- Gdi32.dll : 그래픽 보기 및 조작

- WS2_32.dll : 윈도우 소켓 네트워크 (네트워크 통신)

- Wininet.dll : FTP, HTTP, NTP와 같은 상위 수준 프로토콜 구현 (네트워크 통신)

 

⑦ 리소스 확인 by Resource Hacker

: 아이콘/메뉴/대화상자/버전정보 섹션, 문자열 테이블

+) Dropper : 리소스에 실행 파일이 들어가 있음(프로그램이 이를 같이 실행하게 됨)

 

 

<Lab01-01.exe, Lab01-01.dll 기초정적분석>

1.  기존 안티바이러스 시그니처에 일치하는 파일이 존재하는가?

- Yes

 

 

2. 이 파일은 언제 컴파일 되었는가? 

- Lab01-01.exe의 컴파일 시점은 2010/12/19 16:16:19 이다같은 방법으로 Lab01-01.dll을 확인한 결과, 컴파일 시점은 2010/12/19 16:16:38 이었다.

둘의 컴파일 시간차이가 별로 안나는 것으로 보아 같이 동작하는 것으로 예상된다. (exe가 dll 파일을 동적으로 호출하는 방식일 것이다.)

 

 

3. 이 파일이 패킹되거나 난독화 징후가 있는가? 무엇으로 판단했는가?

- VirusTotal과 PEiD에서 확인한 결과, 두 파일 모두 Microsoft Visual C++ 6.0 버전에서 정상적으로 컴파일된 것을 확인할 수 있고, EP Section 정보도 .text로, 따로 파일이 패킹되거나 암호화되지 않았음을 알 수 있다.

 

 

왼(Lab01-01.exe), 오(Lab01-01.dll)
Lab01-01.dll의 Import - VirusTotal에서 확인

4. 임포트를 보고 악성코드 행위를 알아낼 수 있는가? 그렇다면 어떤 임포트인가?

- ① Lab01-01.exe

CopyFile, FindFirstFile, FindNextFile, FindClose, CreateFile, CreateFileMapping, MapViewOfFile 등의 함수가 쓰인 것으로 보아...

(예측) 파일을 복사한 후, 해당 파일이 존재하는지 찾은 뒤 찾는 행위를 그만두고, 복사한 파일을 복제하기 위한 파일을 하나 생성하는 행위를 하는 것 같다. (정상적 파일을 복사한 후, 악성코드를 심은 다음 다시 배포하는 게 아닐지 예상)

 

② Lab01-01.dll

Sleep, CreateProcess, CreateMutex, OpenMutex, CloseHandle 등의 함수가 쓰인 것으로 보아...

(예측) 잠시 프로세스를 멈춘 후, 새로운 프로세스를 만들고, 동일 프로그램의 중복실행을 막기위해 Mutex를 생성하고 실행하는 것 같다. (백도어로 작용할 것 같다)

 

그리고 PEview에서는 보이지 않던 WS2_32.dll(네트워크 통신을 하는 윈도우 소켓 네트워크)에 쓰인 Import 함수의 내용을 VirusTotal 사이트에서 볼 수 있었다.

 

socket, closesocket, inet_addr, send, connect 등의 함수가 쓰인 것으로 보아...

(예측) 호스트에서 외부 네트워크와 소켓으로 연결한 후 백도어로 작용하여 외부 네트워크에 정보를 전송할 것이다.

 

 

strings 툴을 이용한 파일 문자열 확인

5. 감염된 시스템에서 검색할 수 있는 다른 파일이나 호스트 기반의 증거가 존재하는가?

- Lab01-01.exe를 자세히 보면 kernel32.dll이 아닌 kerne132.dll 파일이 사용된 것이 보인다. Import 함수를 통해 예측한 것을 바탕으로 생각해보면 kernel32.dll의 내용을 복사하여 kerne132.dll이라는 악성코드가 담긴 파일을 생성할 것으로 예상된다. 또한 Lab01-01.dll에서 발견된 127.26.152.13 문자열이 쓰였기 때문에 호스트와 연관된 것으로 보인다.

 

 

6. 감염된 장비에서 이 악성코드를 발견하기 위해 사용한 네트워크 기반의 증거는 무엇인가?

- WS2_32.dll을 사용

 

 

7. 이 파일의 목적은 무엇이라고 판단했는가?

- Lab01-01.exe 는 C:/windows/system32/kerne132.dll 생성하며, kernel132.dll가 Lab01-01.dll파일로 보이며, 이 dll파일은 백도어로 작용해 외부와 통신하며 시스템 정보등을 전송할 것이다.

 


+) <Lab01-04.exe 기초정적분석>

이 파일은 리소스 섹션에 하나의 리소스가 있다. Resource Hacker를 이용해 리소스파일을 점검하고 리소스를 추출해보자. 리소스로부터 무엇을 알 수 있는가?

Resource Hacker에 Lab01-04.exe 올리기

리소스인데 실행 파일(exe)의 패턴(4D 5A, MZ)을 발견할 수 있었다.

이는 리소스에 실행 파일을 숨긴 후 실행 시 숨겨진 exe를 함께 배포하는 것으로 보인다. Dropper의 전형적인 예시같다.



기초 동적 분석

- 프로그램을 직접 실행하며 분석

- 프로그램의 영향 쉽게 파악

- 악성코드 실행 전후 상태를 조사 및 분석

 

1. 악성코드 실습 시 발생하는 호스트/네트워크 환경 구성

2. 파일, 프로그램 실행, 레지스트리, 서비스 등 관련 항목 변경 사항 확인

3. 실행 시 발생하는 네트워크 트래픽 분석

 

동적 분석에 사용하는 도구?

1. 프로세스 모니터(procmon.exe)

: 특정 레지스트리, 파일 시스템, 네트워크, 프로세스, 스레드 행위를 모니터링

+) 한계 : 특정 GUI와 I/O 제어를 통한 루트킷 탐지 불가, 네트워크 행위에 대해 일관성 있는 탐지 불가

 

 

2. 프로세스 익스플로러(procexp.exe)

: 프로세스(EPROCESS 구조체)에 관련된 많은 내용을 확인 가능

: 분석에 아주 유용한 도구

: 다양, 정확

 

 

3. RegShot

: 두 레지스트리의 스냅샷을 찍고 비교

: 악성코드는 자동실행을 위해 레지스트리를 자주 건드림

 

 

4. INetSim

: 맬웨어에게 가짜 서비스를 제공하기에 최고의 도구! 

: 알려지지 않은 맬웨어 샘플의 네트워크 동작에 대한 런타임 분석을 수행하기 위한 도구

: 실험실 환경에서 맬웨어가 일반적으로 사용하는 인터넷 서비스를 시뮬레이트

: HTTP, HTTPS, FTP, IRC, DNS, SMTP 등 서비스를 실행

 

 

5. WireShark 

: 네트워크 분석 프로그램

: 네트워크상 캡처한 데이터에 대한 네트워크/상위 레이어 프로토콜의 정보를 제공

: 패킷 캡처를 위해 pcap 네트워크 라이브러리를 사용

 

 

<Lab03-01.exe 기초동적분석>

VirusTotal에 올렸을 때

VirusTotal 올렸을 시 Import 함수도 제대로 안 보이고, Packer가 쓰인 듯 하여 PEiD로 확인하였다

 

PEiD

역시나 PEncrypt 라는 패킹 툴로 패킹이 되어 있다.

 

strings를 통한 파일 문자열 확인

1. 악성코드의 임포트 함수의 문자열은 무엇인가?

- 패킹되어 ExitProcess 밖에 확인할 수 없다.

strings로 확인 시 여러 레지스트리가 보이지만, 특히 Run 레지스트리에 들어가는 것들은 부팅시에 실행되는 것들이기 때문에 의심할 필요가 있으며, 중간에 보이는 url 주소는 악성코드가 실행되면서 이에 접근할 것이라고 예측할 수 있다.

 

 

2. 악성코드임을 의미하는 호스트 기반 표시자는 무엇인가?

동적 분석을 위한 툴을 모두 준비시킨 후 Lab03-01.exe 실행

RegShot, Procmon, Procexp, Wireshark 준비!

 

RegShot 결과

결과를 보면 레지스트리에 5개의 값이 추가되었고, 2개의 값이 수정이 되었다.

특히, HKLM\SOFTWARE\Microsoft\CurrentVersion\Run에 해당하는 레지스트리 키 값은 부팅 시 자동으로 시작하게 하는 역할을 한다. 따라서 사용자가 부팅할 때마다 이 악성코드가 실행되게 하는 목적이 있는 것 같다.

(strings에서 봤던 VideoDriver는 Run 레지스트리에 자기 자신을 등록하기 위한 키 이름이라는 것을 이제서야 알게 됨)

 

ProcMon

ProcMon에서 확인한 결과, strings에서 봤던 vmx32to64.exe는 C:\Windows\system32\아래에 생성하기 위한 파일 이름이라는 것을 알게 되었다.

 

C:\Windows\system32에 생성된 vmx32to64.exe 확인
왼(vmx32to64.exe), 오(Lab03-01.exe)

WinMD5로 확인한 결과, 두 파일은 정확히 일치했다

따라서 Lab03-01.exe파일이 자기 자신을 복사해서 C:\Windows\system32\아래에 vmx32to64.exe라는 이름으로 파일을 생성함을 알 수 있다.

 

 

 

3. 악성코드를 인식할 수 있는 유용한 네트워크 기반의 시그니처가 존재하는가? 있다면 무엇인가?

- strings에서 봤던  www.practicalmalwareanalysis.com 를 통해 네트워크를 사용한다는 것을 예상할 수 있지만 더 분석해보겠다.

strings에서 본 url로 접속을 하고 이후에는 443포트를 통해 어떤 행동을 하는 것을 확인했다

아래에도 계속 사이트에 접속 후 이러한 데이터를 보내는 것을 알 수 있었다.

 

 

 

 

 

 

라이선스 유효기간이 끝났다는 문자가 뜬다
CreateFileA

1번 문제와 같은 흐름인 것 같다.

CreateFileA는 파일이나 I/O 장치를 만들어내거나 여는 작업을 수행한다.

Keyfile.dat 파일을 원하고 있으니 

Keyfile.dat 파일을 별도로 만들어준다.

Keyfile.dat 추가 후 아무런 내용 적기

 

CreateFileA 함수 이후 CMP EAX,-1 명령어를  실행한다.

화면 하단을 보면 현재 EAX 값이 00000044이므로(다르므로) 둘을 비교 시 1이라는 결과가 나올 것이다.

따라서 ZF는 0(거짓)이 되고, JNZ 명령어를 실행하여 원하는 코드 위치(0040109A)로 간다.

 

그러면 ReadFile 함수가 실행되는 곳으로 넘어오게 된다.

 

ReadFile 함수 이후

XOR EBX, EBX 와 XOR ESI, ESI 명령어를 통해 EBX와 ESI 값을 각각 0으로 만들어준 뒤,

CMP DWORD PTR DS:[412173], 10 명령어로 402173에 있는 값0x10(16진수 10)을 비교하고 있다.

밑에 나와있듯이 DS:[00402173]값은 7이므로 

JL 명령어를 따라 004010F7 위치로 점프하게 된다. ( 그러면 또 프로세스 종료 )

 

따라서 00402173 위치의 값을 10보다 크게 해보자

00402173 값을 10보다 큰 11로 변경

 

그러자 JL 명령어 실행없이 바로 밑 MOV 명령어 부분으로 오게 된다.

MOV 명령어를 통해 EBX+40211A 위치의 값들을 한 바이트 씩 AL로 옮긴 후

CMP 명령어를 통해 0과 각각 비교한다.

 

 

MOV 명령어 이후 AL = 41('A') 이므로

CMP AL, 0 결과는 1 (CMP AL, 0 은 문서의 끝을 파악하기 위한 것임)

같지 않기 때문에 JE 명령어를 건너뛰고 

CMP AL, 47 명령어로 AL과 47('G')을 비교한다.

 

비교 결과 같지 않기 때문에

INC ESI를 건너뛰고

INC EBX로 바로 간다.

이것을 7번 반복하고 (Keyfile.dat에 입력된 길이만큼 반복)

CMP ESI, 8 명령어를 실행한다.

ESI는 1이기 때문에  JL 명령어를 따라 004010F7 위치로 점프하게 된다. ( 그러면 또 프로세스 종료 )

 

004010F7에 도달한 결과

따라서 반복문을 도는 동안(Keyfile.dat 파일에 있는 문자열을 모두 읽어오는 동안) 

전체 길이는 16바이트 이상이어야 하며, 대문자 G가 8개 이상이면 해당 문제를 풀 수 있을 것이다.

 

 

Keyfile.dat

 

성공

'Study > Reversing' 카테고리의 다른 글

Lena 3번 풀이/Rena's Reversing Tutorial 03  (0) 2021.11.03
악성코드 분석  (0) 2021.11.03
윈도우 실행 파일과 패커  (0) 2021.10.06
리버싱 기초 & reverseMe.exe 분석  (0) 2021.09.28
악성코드 유형  (0) 2021.09.18

파일 포맷을 알아야 할 필요성?

- 프로세스 적재를 위한 정보가 들어있음

- API 호출을 위한 IAT가 어떻게 존재하고 있는지 살펴볼 수 있음

- 코드 사이즈와 각 섹션의 위치를 담고 있음

- 언패킹, 안티 디버깅 방법 알 수 있음

- 바이러스 분석 시 필요함

 

 

PE 파일

: 파일(File)이 이식 가능한 다른 곳에 옮겨져도(Portable) 실행 가능하도록(Executable) 만든 포맷(Format)

 

출처 : 인프런_윈도우 악성코드(malware) 분석 입문 과정 강의자료

프로그래머가 작성한 코드는 CPU가 실행할 수 없다. 따라서 컴파일, 어셈블 과정을 거쳐 CPU가 이해할 수 있는 기계어로 이루어진 목적 파일로 변경된다. 하지만 이 목적 파일(obj)은 직접 실행할 수 없는 파일이다. 표준 라이브러리, 사용자 라이브러리 등을 포함하고 있지 않기 때문. 따라서 링킹을 통해 필요한 라이브러리를 obj 파일과 연결하는 과정(링킹)이 필요하고, 이 과정이 끝나면 실행 가능한 exe 파일이 생성된다.

 

 

<PE헤더 복구 실습>

실행되지 않는 파일
PE 헤더 부분에 어떠한 값이 들어있다.
크기 비교 결과 역시나 16바이트가 더 많다.
HxD를 통해 해당 줄을 지워주고 저장
정상 복구

 

 

또 다른 파일 예시. HxD의 [Analysis] - [File-compare] - [Compare] 등을 통해서도 쉽게 비교 가능

 

 

패커(Packer)

: 실행 파일 압축기

 

- 사용 목적 : PE 파일 내부 코드와 리소스(string, API 등)를 감추기 위한 목적

               + 프로텍터 (패킹 기술로 리버싱을 막기 위한 다양한 기법을 추가하는 것. 쓰레기 코드를 넣어 원본보다 크기가 커질 수 있음)

 

※ 각종 백신 우회 방법

- 시그니처 변경 (단순히 변수 몇 개를 추가 및 함수 위치를 변경하여 리빌드)

- 쓰레기 코드를 통한 우회 방법 (네 줄이 수행된 결과를 보면 아무것도 바뀌는 것이 없음(대칭 구조))

- 헤더 변조 (TimeDateStamp, Optional Header의 CheckSum, 메모리 속성 변조) -> 해시값 변경

- 대체 가능한 어셈블리어 (sub ebp, 7 >> add ebp, 7..)

- 실행조차 되지 않는 코드

 

 

* Themida

출처 https://www.oreans.com/Themida.php

: 지상 최고의 패커, 안티 디버깅과 안티 분석, 언패킹 분석을 매우 어렵게 하는 안전한 패커이다.

VMware, 디버거, 프로세스 모니터(ProcMin, Process Monitor) 분석을 방지하는 기능(자신을 분석하는 줄 알고)

패킹된 실행 파일은 이례적으로 크기가 큼

언패커가 존재하나 Themida 버전과 프로그램을 패킹할 때 사용한 설정에 따라 성공률이 다르다

 

 

<UPX>

오리지널 notepad 파일
upx.exe ori_notepad.exe 명령어로 패킹
언패킹은 이렇게. -d 옵션을 주면 됨
원본 파일을 건드리지 않고 패킹된 새로운 파일 생성할 떄는 -o 옵션
새로 생성된 파일

 

ori_notepad_upx 의 어셈블리 코드

UPX의 특징? PUSHAD & POPAD

 

먼저, 01015320 PUSHAD 명령어를 통해 EAX~EDI 레지스터 값이 스택에 저장, 

그 후 POPAD를 통해 레지스터 복구 후 원래 코드의 Entry Point로 가게 된다.

 

 

upx 로 패킹되어 있는 파일
PUSHAD 실행
ESP 위치로 가서 Hardware Breakpoint를 건다
그러면 POPAD 명령어까지 실행된 이후의 상황이 된다. 원래 처음의 레지스터 상태로 돌아온 것 

00401000 이 OEP인 것을 확인할 수 있다.

(원본 프로그램 시작)

 

 

OllyDBG의 플러그인을 사용해 덤프를 뜨겠다
Rebuile Import 체크 해제, DUMP 파일 따로 저장

여기서의 Import 내용을 DUMP 뜬 파일에 수동으로 재구축할 것이다.

 

OEP와 Import Size를 변경해주었다.
Fix Dump 결과

'Study > Reversing' 카테고리의 다른 글

악성코드 분석  (0) 2021.11.03
Lena 2번 풀이/Rena's Reversing Tutorial 02  (0) 2021.10.27
리버싱 기초 & reverseMe.exe 분석  (0) 2021.09.28
악성코드 유형  (0) 2021.09.18
Suninatas_11번 문제 풀이  (0) 2021.05.19

C ----컴파일----> CPU가 읽을 수 있는 언어(기계어) 11010011 ----디스어셈블 ----> 어셈블리어

 

어셈블리어

- 한 가지 동작까지 세세하게 지정

- 주로 IA-32 를 사용(Intel)

- 기본형태 : 명령어(opcode) + 인자(operand 1~2)

 


CPU가 사용하는 변수, 저장공간 (레지스터)

:: EAX (연산 Accumulator, 리턴 값 저장)

:: EBX, EDX (목적이 없는 레지스터, 공간 필요시 사용)

:: ECX (for문에서 i의 역할 Count, 변수로 사용해도 무방)

:: ESI, EDI (source index, destination index. 문자열이나 반복데이터 처리, 메모리 옮기는데 사용)

:: ESP (스택포인터)

:: EBP (베이스포인터)

:: EIP (인스트럭션 포인터, CPU가 실행할 명령어를 가리킴)


어셈블리 명령어

- PUSH, POP (PUSHAD, POPAD) : 모든 레지스터에 있는 값들을 스택에 push, pop

- MOV : source를 가져옴

- LEA : source의 주소를 가져옴

- ADD : +

- SUB : -

- INT : 잠깐 정지

- CALL : 함수 호출

- INC, DEC : i++, i--

- AND, OR, XOR : bit 연산

- NOP : 실행하지 않고 다음 단계로 넘어감

- CMP, JMP : 비교, 점프

 


리버스 엔지니어링에 필요한 스택

> 함수 프롤로그 & 함수 에필로그

함수 프롤로그는 스택을 만드는 역할, 에필로그는 스택을 지우는 역할을 한다.

 

ex) main함수에서 plus라는 함수를 또 호출하는 상황 = 프롤로그

push ebp          이전 함수의 ebp를 스택에 저장하기 위해

mov ebp, esp     esp 값을 ebp에 저장. 같은 곳을 가리키게 됨

sub esp, 50h      esp에서 50h 위치만큼 값을 줄임(esp가 위로 상승) 

                        --> 그 결과, 새로운 plus 함수를 위한 스택 공간이 할당됨

 

.....

 

plus 함수에서 main 함수로 돌아가는 상황 = 에필로그

mov esp, ebp     돌아가기 위해(스택 정리) ebp를 esp에 할당해줌

pop ebp            ebp를 스택에서 빼면 main 함수의 다음행 주소가 스택에 있고 

retn                  main 함수로 돌아간다.

 

 


<reverseMe.exe 분석>

 

만료일이 다 됐으니 라이선스를 구매하라는 문구가 뜨고 확인을 누르면 그대로 꺼진다

 

이 파일을 제대로 동작하게 만들어 보겠다

 

실행파일의 전체적 코드

코드를 보다보니 CreateFileA 함수가 눈에 띈다.

MSDN에서 찾아봤다.

 

CreateFile 함수는 파일을 생성하는 것뿐만 아니라 파일을 읽어오기도 한다고 한다.

그리고 코드 내에서 dwShareMode가 OPEN_EXISTING 값을 가지는데 이것은 무슨 의미인지 확인해보았다.

 

CreateFile이라고 해서 단순히 File을 생성하는 것인줄 알았으나 

제대로 알아보니 file 또는 장치가 있다면 이를 열어주는 작업을 하고 있다.

 

CreateFile 함수 이후

EAX와 -1을 비교하고 있다. EAX에 FFFFFFFF가 들어있으므로 둘은 같다.

따라서 CMP 문을 지나면 ZF가 1(참)이 되고, JNZ 명령어를 따를 필요가 없으므로 

처음에 봤던 문장 "Evaluarion period out,,,," 을 띄우는 MessageBox 함수 부분을 실행한다.

 

 

그래서 일단 

ZF를 0으로 임시로 바꿔준 후 ReadFile 함수를 실행하도록 한다.
ReadFile 함수 이후

TEST EAX, EAX 명령어를 실행한다.

EAX는 0 이므로 ZF는 1이 되어

JNZ를 따르지 않고 그 밑의 JMP 명령어를 실행한다.

 

JMP 명령어 이후

파일이 존재하지 않는다는 오류와 함께 프로세스가 종료된다.

 

그렇다면 이 파일이 존재할 때는 어떨까?

 

Keyfile.dat 파일 생성
저장

 

ReadFile 함수 결과

그 결과 EAX가 1의 값을 가지는 것을 알 수 있고

 

원하던 위치로 오게 되었다.

XOR 명령어로 EBX와 ESI를 각각 0으로 만들어준 후

CMP DWORD PTR DS:[412173], 10 명령어로 402173에 있는 값과 10을 비교하고 있다.

밑에 나와있듯이 DS:[00402173]값은 4이므로 

JL 명령어를 따라 004010F7 위치로 점프하게 된다.

 

 

그러면 00402173에 있는 값이 10보다 크면 될까?

(이 값이 무엇을 의미하는지 나중에 알게 됐다)

 

00402173 값을 a로 변경하여 HEX 값이 10보다는 크게 만든다
40211A에 있는 값을 AL로 MOV 한다

0040211A부터는 우리가 적었던 내용인 test가 있고 여기서부터 파일의 내용을 다루는 것 같다.

 

MOV 명령어 이후 AL = 74('t') 이므로 

CMP AL, 0 결과는 1 

같지 않기 때문에 JE 명령어를 건너뛰고 

CMP AL, 47 명령어로 AL과 47('G')을 비교한다.

 

비교 결과 같지 않기 때문에 

INC ESI를 건너뛰고

INC EBX로 바로 간다.

이것을 4번 반복하고 (입력한 내용만큼 반복)

CMP ESI, 8 명령어를 실행한다.

ESI는 0이기 때문에 JL 명령어를 실행하지 않고 바로 아래 명령어를 실행하고 ,,

 

그 결과 

성공

 

따라서 유추해보면 Keyfile.dat에 들어있는

글자수는 16 이상이어야 하고, 8개 이상의 G 문자가 필요한 것이다. 

 

 

 

 

 

Keyfile.dat 수정

 

성공

'Study > Reversing' 카테고리의 다른 글

Lena 2번 풀이/Rena's Reversing Tutorial 02  (0) 2021.10.27
윈도우 실행 파일과 패커  (0) 2021.10.06
악성코드 유형  (0) 2021.09.18
Suninatas_11번 문제 풀이  (0) 2021.05.19
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18

Avast가 제시하는 기업이 직면한 악성코드 유형 8가지

 

1. 랜섬웨어(Ransomware) 

:: 파일을 암호화해 접근을 차단하고 잠금 해제를 위한 금전 요구

 

- 문서 파일, 사진(PC에 저장된 경우) 등을 노림

- 빠르게 발전되는 악성코드 중 하나이며 감염 즉시 파일 삭제나 암호화를 시작한다.

- 가장 일반적인 방법 : 합법적 '전자 메일'로 위장해 첨부 파일 다운로드 & 실행 유도

zip, js 파일 등의 첨부 파일이 많이 포함된다.

- 복구가 가능한가? 랜섬웨어가 최신 암호화가 사용되었다면 복구화는 보통 힘들다. 범죄자가 잘못 만들었다(코드 안에 키 값등이 나와있는 경우,,)면 복구는 가능하다. 

 

2. 트로이목마(Trojan) 

:: 신뢰할 수 있는 소프트웨어나 응용 프로그램으로 위장하여 접근 후 사용자의 컴퓨터에 여러 유형의 악성코드를 감염시킴

 

- 배포하는 방식이라고 보면 됨

- 가장 일반적인 방법 : '크랙 제품'을 위장해 블로그나 전자 메일에 첨부해 다운로드 & 실행 유도

- 왕성하게 활동해 백신에서 쉽게 볼 수 있는 악성코드

- 대표적 탐지 사이트 : VirusTotal

 

 

3. 웜(Worm) 

:: 네트워크 상의 취약점을 찾아 스스로 복제

 

네트워크 공유 시 자주 발생 -> 회사 네트워크에 웜 바이러스가 걸린다면 아주 위험

- 자체 복제 및 확산되는 악성코드 유형

- 빠르게 확산되기 위해 별도 사람의 행동 불필요

- 랜섬웨어 + 웜 = 워너크라이

 

* 워너크라이(WannaCry)

- 이메일 첨부파일을 통해 유포되는 일반적인 랜섬웨어와 달리 인터넷 네트워크에 접속만 해도 감염됨

- 문서 파일, 압축 파일, 데이터베이스 파일, 가상머신 파일 등 다양한 파일을 암호화하며, 비트코인을 요구하는 메시지를 띄우는 것이 특징

 

 

4. 키로거(KeyLogger)

:: 키 입력을 추적해 숨김 파일로 저장 후 자동으로 파일 전송, 정보 탈취

 

피시방에 로그인 할 시 탈취하기 위한 목적, 은행 계좌 정보(비밀번호),  sns 비밀번호 탈취 목적

- 키 입력 데이터를 사용해 암호 또는 개인, 비즈니스 정보를 해커에게 자동 전송

- 예시) Phoenix keylogger가 실행되면 시스템, 클립보드, 가상환경 정보 등을 C&C 서버(악성코드에서 명령을 할 수 있는 서버)로 전송 -> 2차 공격(사용자 계정 로그인, 악의적 광고 글 올리기 등)

 

 

5. 봇(Bot)

:: 자동화된 컴퓨터 프로그램으로 작동하는 악성 소프트웨어의 일종

 

- 봇넷은 해커가 여러 봇에 감염된 컴퓨터를 제어하는 웹 사이트를 공격하는데 사용하는 하나 이상 봇

- 봇넷을 사용하여 스팸 메일 과부하, DDoS 공격(가용성 훼손. 서비스 중단)을 하는 등 다양한 공격 가능

- 봇 운영자에 의해 명령어를 수행할 수 있는 악성코드

 

 

6. 루트킷(Rootkit)

:: 컴퓨터에 엑세스하거나 제어하도록 설계된 정보를 훔치는 악성코드

 

- 루트(Root) 권한을 쉽게 얻게 하는 키드(Kit), 주로 파일이나 레지스트리를 숨김

- 보안 취약점으로 침입하여 제거하기가 매우 어려워 예방이 중요

- 관리자 권한 획득(어려움) 후 시스템 훼손, 정보 획득을 하기 위함

- 예시) 커널 루트킷 = 사용자(커널) 모드에 악성코드를 심어놓으면 사용자 어플리케이션을 접근할 수 있는 권한이 없어짐, 커널에 은닉하고 있어 백신에서 탐지가 어려움. 포맷이 답이다.

- 첨부파일, 신뢰하지 않는 사이트에서 다운로드 조심

 

 

7. 스파이웨어(Spyware)

:: 사용자 활동을 감시하는 악성 소프트웨어

 

- 스트로크 수집부터 브라우저 히스토리, 데이터 수집에 이르는 사용자 활동 감시

- 트로이 목마 등에 포함된 경우가 일반적

- 사용자의 화면 캡쳐, 실시간 화면 감시 등의 방법

- 두 가지 용도 = 합법적 용도 (자녀 보호 온라인 소프트웨어, 민감 정보 누설 방지를 위한 회사 컴퓨터 모니터링) vs 악의적 용도 (신원 도난을 위한 개인 데이터 수집, 은행 세부 정보로 사용자 금전 엑세스)

- 백신 입장에서 이 목적을 판단하기 힘들어 탐지가 어려움

 

 

8. 바이러스(Virus)

:: 프로그램이나 응용 프로그램에서 붙어서 실행되는 악의적인 프로그램을 총칭

 

- 컴퓨터에서 컴퓨터 혹은 전체 네트워크를 통해 전달될 수 있는 소프트웨어

- 실행될 때 다른 프로그램이나 문서도 감염 가능

'Study > Reversing' 카테고리의 다른 글

윈도우 실행 파일과 패커  (0) 2021.10.06
리버싱 기초 & reverseMe.exe 분석  (0) 2021.09.28
Suninatas_11번 문제 풀이  (0) 2021.05.19
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18
CodeEngn Challenge : Basic RCE L14  (0) 2021.05.11

문제

RegisterKEY 값을 찾는 문제이다.

 

 

PEiD로 확인

Delphi라는 언어로 작성된 코드라고 한다.

정상적 실행 파일인가보다.

 

처음 코드

정상적인 코드이다.

 

[마우스 우클릭]-[Search For]-[All referenced text strings]

실행 파일에 쓰인 문자열들을 확인해봤다.

Congratulation 문자열이 먼저 눈에 띄었고, 

뭔가 힌트가 될만한 문자열 (2V, XS, B6, H1, 0F)이 눈에 띄었다.

 

 

해당 문자열이 있는 곳으로 가서 어셈블리 코드를 확인했다.

 

PUSH DWORD PTR DS:[EBX+310]

PUSH DWORD PTR DS:[EBX+318]

PUSH DWORD PTR DS:[EBX+31C]

PUSH DWORD PTR DS:[EBX+314]

PUSH DWORD PTR DS:[EBX+320]

 

PUSH 명령어로 해당 값을 스택에 순서대로 넣고 있다.

따라서 레지스터 키 값을 2VB6H1XS0F 라고 예상해볼 수 있다.

 

Congratulation 문자열이 나오기 전 점프 명령어에 BP를 걸고 실행

레지스터 키 값을 입력하는 곳에 asdf 라는 문자열을 입력했더니 

EAX에 asdf가 들어가고

EDX에는 2VB6H1XS0F가 들어가는 것을 확인할 수 있다.

 

따라서 예상한 키 값이 맞는 것 같다.

성공

'Study > Reversing' 카테고리의 다른 글

리버싱 기초 & reverseMe.exe 분석  (0) 2021.09.28
악성코드 유형  (0) 2021.09.18
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18
CodeEngn Challenge : Basic RCE L14  (0) 2021.05.11
[HackCTF] Reversing Me 풀이  (0) 2021.05.11

Easy_UnpackMe.exe 실행 시 화면

프로그램 실행 시 아무런 동작을 하지 않고 하얀 화면만 뜬다.

 

ReadMe.txt 확인

ReadMe.txt 를 확인해보니 OEP를 찾는 문제인 듯하다.

 

PEiD 실행 결과

PEiD에 넣어보니 EP Section도 비정상적이며, 컴파일 환경도 보이지 않는 것으로 보아 

패킹된 파일임을 짐작할 수 있다.

OllyDBG 실행

OllyDBG를 실행시켜보니 역시나 Entry Point의 문제에 대해 경고창을 띄우고 있다. 

패킹이 된 파일임이 확실하다.

 

처음 코드

코드의 처음 부분이다.

여태껏 봐왔던 시작 코드와는 다른 느낌.

그리고 계속 의미없는 반복문, 분기문이 계속되는 것을 확인할 수 있었다. 

 

수많은 분기문 맨 끝 JMP 문에 있는 주소를 확인했다.

이게 OEP 주소인 듯 싶다.

 

[F8키]로 확인

JMP 00401150 명령어를 실행시켜 해당 주소로 가보니

어셈블리 코드가 보이지 않는다.

따라서 OllyDBG의 코드 재분석 기능(Ctrl+A)를 사용하여 코드를 재분석해보았다.

 

코드 재분석

PUSH EBP 코드가 나온다.

00401150이 OEP 주소가 맞다보다.

 

OllyDump 기능 이용하여 덤프파일 뜨기

 

PEiD 재확인

덤프 뜬 파일을 PEiD로 재확인한 결과, 정상적인 결과로 나온다.

따라서 00401150이 OEP가 맞다.

오잉

'Study > Reversing' 카테고리의 다른 글

악성코드 유형  (0) 2021.09.18
Suninatas_11번 문제 풀이  (0) 2021.05.19
CodeEngn Challenge : Basic RCE L14  (0) 2021.05.11
[HackCTF] Reversing Me 풀이  (0) 2021.05.11
CodeEngn Challenge : Basic RCE L11  (0) 2021.05.06

문제

Name이 CodeEngn일 때 Serial을 구하는 문제이다.

 

실행결과

잘못된 Serial 값을 입력하면 위 그림과 같은 창이 뜬다.

 

PEiD 로 패킹여부 확인

PEiD로 패킹여부를 먼저 확인했다. 확인한 결과, UPX로 패킹되어 있는 것을 알 수 있었다.

따라서 UPX 툴을 사용해 먼저 언패킹 시켜주었다.

 

UPX 툴로 14.exe 언패킹

 

[우클릭] - [Search for] - [All referenced text strings]
위의 그림 결과

그 결과, 프로그램에 사용된 문자열들이 보였다.

성공 문자열이 있는 곳으로 가 코드를 확인해 보겠다.

 

분기문 확인

CMP로 EAX와 ESI 값을 비교한 후 JNZ 분기문을 통해서 성공/실패 문자열이 가는 곳이 나뉘어 진다. 

따라서 CMP 문이 있는 곳에 BP를 걸고 실행을 했다.

 

 

CodeEngn, 1234를 입력하고 BP를 건 곳까지 실행했을 때,

EAX에는 우리가 입력한 1234가 HEX 값으로 저장되어 있다는 것을 확인할 수 있었다.

 

 

따라서 ESI에 있는 값도 확인한 결과, 10진수로 76193이라는 값이라는 것을 알았다.

 

성공~

'Study > Reversing' 카테고리의 다른 글

Suninatas_11번 문제 풀이  (0) 2021.05.19
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18
[HackCTF] Reversing Me 풀이  (0) 2021.05.11
CodeEngn Challenge : Basic RCE L11  (0) 2021.05.06
CodeEngn Challenge : Basic RCE L10  (0) 2021.05.06

문제 화면

알맞은 키를 입력하면 풀리는 문제인 것 같다.

 

 

전체 소스코드

 

(enter[i] ^ (i % 2)) == serial[i]

 

이게 주요 코드인 듯 싶다.

 

우리가 입력한 enter 값과 (i%2)를 XOR 연산하여 serial 값과 비교하고 있다.

A^B=C 라면 A=B^C 라는 속성을 가지기 때문에

enter[i] = (i%2) ^ serial[i] 이 된다.

 

 

 

소스코드와 결과

이렇게 소스코드를 짜면 아래와 같은 flag 값이 나온다.

'Study > Reversing' 카테고리의 다른 글

Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18
CodeEngn Challenge : Basic RCE L14  (0) 2021.05.11
CodeEngn Challenge : Basic RCE L11  (0) 2021.05.06
CodeEngn Challenge : Basic RCE L10  (0) 2021.05.06
CodeEngn Challenge : Advance RCE L09  (0) 2021.04.28

+ Recent posts