안철수연구소에서 근무하시는 이상철씨가 쓴 책이다.
단순 보안 실무자로서의 삶 뿐만 아니라 악성코드의 작동 매커니즘에 대해서도 세부적으로 다루고 있기 때문에 악성코드들 (혹은 리버싱 예제)의 분석에 있어 초석이 될만한 서적이라고 생각한다.
후자의 내용에 대해서 기억을 해두기 위해 몇가지 적어보려고 한다.
Packer
프로그램을 암호화하여 원래 들어있는 어셈블리 코드를 보지 못하도록 하는 변조화 기능이라고 알고 있었다. 하지만 정확한 유래와 그 매커니즘은 알지 못했다.
간략하게 정리하자면, 원래 Packer은 프로그램을 압축하기 위해서 사용되는 도구였으나, 이후 리버싱을 방지하기 위해 프로그램을 암호화하는 도구로 용도가 바뀌었다고 볼 수 있다. 종류 또한 여러가지로 알고 있는데, 기본적인 Packer은 프로그램의 암호화된 바이너리 데이터와 해당 데이터를 Decode하는 디코더 부분이 들어있다고 한다. 따라서 디코더를 이용하여 데이터를 찾아낼 수 있다.
그 외 가상화 Packer 등이 있는데, 가상화에서는 유명한 Packer로 Themida가 있다. CISC 명령어 대신 RISC 명령어를 사용하도록 프로그램 데이터를 구성하였고 이를 에뮬레이팅해서 실행한다고 한다. 상상치도 못하던 패커 매커니즘이라 좀 놀람 -_-;. 따라서 가상머신에서 구동이 불가능하다고 한다.
다형성 생성기(코드), 그리고 Gen 코드
다형성 생성기는 중간에 쓰레기 코드 (JMP, MOV, ADD, CALL 등)을 넣어 분석을 어렵게 하는 역할을 한다. 몇가지 패턴을 기반으로 생성이 되므로 해당 패턴을 알아내면 유효 코드를 찾을 수 있게 된다.
Gen 코드는 비슷한 종류의 바이러스(이하 변종)들을 함수 하나만으로 진단하도록 하는 코드를 의미한다. 변종이 일일이 나올때마다 대처하기에는 시간도 효율성도 떨어지는 경우가 잦기 때문에 필요하다. 가끔 백신을 돌리다 보면 바이러스 진단명에 Gen이 들어가는 경우가 있는데... 이젠 이해할 수 있으니 이하생략.
백신의 가상화
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
스택 그리고 프로파일링
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 |