Loading
2013. 3. 3. 23:43 - lazykuna

책 "악성코드, 그리고 분석가들"

안철수연구소에서 근무하시는 이상철씨가 쓴 책이다.

단순 보안 실무자로서의 삶 뿐만 아니라 악성코드의 작동 매커니즘에 대해서도 세부적으로 다루고 있기 때문에 악성코드들 (혹은 리버싱 예제)의 분석에 있어 초석이 될만한 서적이라고 생각한다.

후자의 내용에 대해서 기억을 해두기 위해 몇가지 적어보려고 한다.



Packer

프로그램을 암호화하여 원래 들어있는 어셈블리 코드를 보지 못하도록 하는 변조화 기능이라고 알고 있었다. 하지만 정확한 유래와 그 매커니즘은 알지 못했다.

간략하게 정리하자면, 원래 Packer은 프로그램을 압축하기 위해서 사용되는 도구였으나, 이후 리버싱을 방지하기 위해 프로그램을 암호화하는 도구로 용도가 바뀌었다고 볼 수 있다. 종류 또한 여러가지로 알고 있는데, 기본적인 Packer은 프로그램의 암호화된 바이너리 데이터와 해당 데이터를 Decode하는 디코더 부분이 들어있다고 한다. 따라서 디코더를 이용하여 데이터를 찾아낼 수 있다.

그 외 가상화 Packer 등이 있는데, 가상화에서는 유명한 Packer로 Themida가 있다. CISC 명령어 대신 RISC 명령어를 사용하도록 프로그램 데이터를 구성하였고 이를 에뮬레이팅해서 실행한다고 한다. 상상치도 못하던 패커 매커니즘이라 좀 놀람 -_-;. 따라서 가상머신에서 구동이 불가능하다고 한다.


다형성 생성기(코드), 그리고 Gen 코드

다형성 생성기는 중간에 쓰레기 코드 (JMP, MOV, ADD, CALL 등)을 넣어 분석을 어렵게 하는 역할을 한다. 몇가지 패턴을 기반으로 생성이 되므로 해당 패턴을 알아내면 유효 코드를 찾을 수 있게 된다.

Gen 코드는 비슷한 종류의 바이러스(이하 변종)들을 함수 하나만으로 진단하도록 하는 코드를 의미한다. 변종이 일일이 나올때마다 대처하기에는 시간도 효율성도 떨어지는 경우가 잦기 때문에 필요하다. 가끔 백신을 돌리다 보면 바이러스 진단명에 Gen이 들어가는 경우가 있는데... 이젠 이해할 수 있으니 이하생략.


백신의 가상화

위에서 이야기한 Themida 패커와 비슷하다. 바이너리를 기반으로 하여 파일의 감염 여부를 진단하기에는 너무나도 시그니쳐가 다양하기 때문에 패킹되어있는 파일의 경우 어느 정도 수준으로 가상화(프로그램 실행)를 한 뒤 프로그램 덤프값을 확인하여 진단한다고 한다. 여기서의 가상화는 윈도우즈가 실제로 프로그램을 구동하는 것이 아니고, 프로그램을 자체 엔진으로 어느정도 구동(여기서 부동소수점과 같이 고수준의 연산을 요구하는 명령어들은 제외되어 구동된다)시키는 것을 의미한다. 즉 실제로는 영향을 끼치지 않는 선에서 구동되는 것이다.

WFP(Windows File Protection) 기능 해제

생각외로 간단했다. 

sfc_os.dll#SfcTerminateWatcherThread()

... 이런 건 함부로 공개하면 안 되는 거 아닌가.. 라지만 아마 리버싱으로 알려진 거겠지.


코드 디버깅 방지

(GameHack) SEH(Structured Exception Handling)을 발생시키는 경우가 있다. 유효하지 않은 EAX값을 사용하여 예외를 발생시키므로 EAX값을 변경시켜줘야 함.

매커니즘은 잘 모르겠다. 디버깅 시에는 해당 코드가 인터럽트가 걸려버려서 진행이 불가능하기 때문인가?


(Rustock.C) 디버깅 관련 레지스터인 DR0~3 값을 덮어씌워서 브레이크 포인트값을 무력화시키고 DR7 레지스터 값을 덮어씌워 커널 디버거를 제대로 동작하지 못하게 함. 체크섬 트릭을 이용해 디버깅을 위해 BP를 걸면 BSOD가 나타나도록 함.... 레지스터로 디버깅을 조작하는 것도 미스테리지만 제일 마지막 트릭은 원리가 뭔지도 모르겠다.... 아 내공이 딸려...


그 외 엄청나게 많은 디버깅 방지 팁이 존재하나 근본 매커니즘은 잘 모르겠다.


IDT / SYSENTER / SSDT Hook

메시지 기반 운영체제인 윈도우즈는 어떠한 함수 하나가 최종적으로 실행되기까지 수많은 과정(Func Calls, JMPs)들을 거친다.
윈도우즈 기반에서 제공하는 후킹 방법이나 몇가지 함수만으로 구현하는 후킹 방법들이 있지만, 사실상 해당 과정에 들어가는 몇 바이트만 수정하면 그게 곧 후킹이라고 볼 수 있다.
CreateFile을 예시로, 유저레벨에서 호출한 CreateFile은 다음과 같이 실행된다. (그냥 편의상 대충 써놓음. 책의 p151에 해당 구조도가 있음)
[User] CreateFile
> [Kernel32] NtCreateFile
>> [Ntdll.dll] MOV EAX, XX
-> INT 2E -> 0x2E -> IDT Table
-> SYSENTER
>>> System Service Dispatcher(KiSystemService)
>>>> SSDT (System Service Dispatcher Table)

Rustock이라는 바이러스는 흔히 쓰이는 SSDT대신 SYSENTER 도입부분을 후킹했다고 한다.
(덧: SSDT와 IDT는 함수가 실행되는 주소를 가지고 있는 테이블이다)
해당 값을 변경하기 위해 MSR(rdmsr, wmmsr) 명령어를 사용한다고 한다.

스택 그리고 프로파일링

스택 메모리는 말 그대로 그냥 스택 메모리.. (..) 라고 해야 하나 여튼 ESP가 스택레지스터인걸로 알고 있고 해당 스택에는 필요한 주소값들을 넣는걸로 안다. PUSH와 POP으로 관리가 된다고 알고 있... 으나 이쪽 부분은 내가 무지한 관계로 공부를 해야...
스택메모리를 보면 실제로 관련된 함수 혹은 변수들의 주소가 들어가 있는 걸 알수 있다. 이는 실행중인 함수의 주소가 되기도 하고 매개변수값이 되기도 하고...

프로파일링 기능은 Animate into & Run trace이라고 하는데 잘은 모르겠고 나중에 써봐야겠다. 후자의 창에서 레지스터에 Highlight를 걸수도 있다고 하는데 이것도 살펴봐야겠다. (이미 쓰고있는건지도 모르겠다)

0xCC(INT 3) & Just-in-time debugging

실행되는 데이터가 있으니 해당 프로세스 혹은 쓰레드에 인젝션을 하기 어려운 경우가 있다 (메모리상에서 곧바로 실행을 하거나, 서비스 및 드라이버 단위의 프로그램일 경우)

그럴 땐 EP와 같은 적절한 부분을 0xCC로 패치한 후 JIT를 걸면 해당 코드가 실행될 때 디버거를 붙일 수 있다. (붙인 뒤에는 물론 코드를 복구해주자)

어떻게 분석을 하나 했더니 요런 팁이 있었네...


전혀 엉뚱한 함수 호출

악성코드에서 스풀 드라이버 설치 함수를 구동하거나 swprintf와 같은 함수 실행만으로 감염이 순식간에 일어나는 경우가 있다.

전자와 같은 경우는 LoadLibrary를 내부적으로 구동하기 때문이고, 후자와 같은 경우는 스택 메모리를 교묘하게 조작하여 악성코드를 실행시키기 때문이다.

... 무서운 것들...

이러한 방식의 공격이 제일 교묘하고 천재스럽다고 생각한다. 해커들은 다 천재야...


분석가가 되기 위해서는

책 구절에 이런 이야기가 있었다.

"분석가가 되기 위해서는, 리버싱보다는 시스템에 대한 깊은 이해가 필요합니다. 의사가 사람 몸의 내부를 아는 것과 비슷한 이치지요."


맞는 말이라고 생각한다.

물론, 해커가 되기 위해서도 마찬가지라고 생각한다.






여러 악성코드들 예시가 나왔지만 가장 기억에 남는 건 TDL3, Rustock와 msiexec1.exe DDoS 바이러스...

TDL3, Rustock는 그 기술력에, 후자는 그 복잡한 매커니즘으로 유기적인 동작이 인상깊어서...

(TDL3는 자신의 몸체를 Unpartitioned 부분에 저장한 데다가 디스크 액세스 값마저 변조하는 무서움을 보여주는 게 ... 그 자체가 운영체제랑 유기적으로 동작하는 것 같다)


바이러스는 정말이지 컴퓨터 커널/OS 엔지니어링의 꽃인 것 같다.

좀 세다 싶은 바이러스는 서비스는 물론이고 커널, 존재조차 몰랐던 ADS 파일시스템과 MBR 부트섹터까지도 유연하게 침입한다. 실행을 위해서 프로세스를 쓰지도 않고 쓰레드만으로 구동되기도 한다.

말 그대로 "코드"만 실행시킬 수 있으면 되니까 프로세스도, 물리 디스크 저장공간도 필요가 없는 것이다.

또한 네이티브 함수나 관련 구조체들을 도대체 어디서 알아온건지 몰라도 해박하게 꿰뚫고 있다.

생각지도 못하는 트릭들을 만들어내는 해커들은 정말이지 천재인듯 하다...

그리고 이러한 트릭들을 뚫기 위해서는 OS 및 시스템의 구조와 원리에 대한 깊은 지식이 필요하다. 관련없어보이는 그 지식들이 엮여서 하나의 기능을 한다는 걸 알아채는 게 바로 퍼즐을 맞추는 기분인건가 싶다.


이제 개강이다.

페인터 테크닉 책이랑 믹싱 테크닉 및 코드 이론 책 다 빌려놓은거...

언제보냐....

'리뷰' 카테고리의 다른 글

오래간만의 영화, Love letter  (0) 2013.09.21
유유코는 리듬게이입니다  (21) 2011.11.17
책 '언어의 기술'에 대한 지극히 개인적인 평.  (22) 2011.03.26