분석해보까? 2009.12.03 17:43



디버깅을 하다 보면 참 여러가지 난관에 봉착하게 된다.
이중 하나가 안티디버깅(Anti Debugging) 이다.
개발자가 디버깅을 통해 내부 코드를 공개하기 싫다거나, 디버깅 자체를 막기 위해서 사용하고 있다.

하지만 지금 얘기하는 Float 버그는 올리디버그 프로그램의 버그이다.
현재 많이 알려져 있는 버그로써, Floating-Point Bug 라고 불려지며 올리디버거가 FlD 명령어를 모두 처리하지 못하여 발생하는 버그이다. 
분석을 하면서 악성파일이 버그가 적합된건 처음이기 때문에 포스팅을 해둔다(물론 내가 처음본거다 ㅡ.ㅡ; 오해하지 말길 ㅋㅋ)
또한 이것도 어떻게 생각하느냐에 따라서 안티디버깅이 될 수도 있다^^;

우선 코드를 살펴 보자~
코드를 보게 되면 , 이런 부분을 볼 수 있다.
db 0FFh  이 부분을 올리에서 처리 할 수 없어서 올리디버거가 강제 종료 된다.

seg000:0000005E DB 2D 64+                fld     tbyte ptr ds:10064h
seg000:0000005E 00 01 00 ; ---------------------------------------------
seg000:00000064 FF                       db 0FFh
seg000:00000065 FF                       db 0FFh
seg000:00000066 FF                       db 0FFh
seg000:00000067 FF                       db 0FFh
seg000:00000068 FF                       db 0FFh
seg000:00000069 FF                       db 0FFh
seg000:0000006A FF                       db 0FFh
seg000:0000006B FF                       db 0FFh



실제로 악성파일을 동작시켜보면 다음과 같다.

그림1은 올리디버거에서 복호화 하기 전의 덤프창 내용이다.
아직은 변한게 없기때문에 오류가 나오지 않는다.
(그림 1. FLD를 처리 하기 전)

그림1에서 계속 디버깅을 실행하면 다음과 같이 올리디버거가 종료되게 된다.
(그림 2. FLD 버그로 인한 올리디버거 종료)

그럼 Floating-Point Bug를 피하는 방법을 알아보자

Assem Code 창에서 복호화를 통해 코드가 덧 씌워지는 부분이 있다.
0x0001004A 부분부터 코드가 씌워지기 때문에 그부분을 화면에 출력시키지 않으면 된다.
올리디버거의 Dump창을 코드가 씌워지는 부분까지 드래그(노란색화면)하여 안보면 다음과 같이 오류가 나오지 않고, 분석을 계속 할 수 있다.

한가지 더  Dump창의 FF FF FF FF FF FF FF FF 부분을 모두 사용하지않는 00으로 변경 시키면 된다.
(그림 3. Floating-Point Bug를 피한 디버깅)

이 문제는 Obllydbg 1.x 에서 나오는 버그이며, 현재 Ollydbg 2.0 베타버전에서는 이 문제가 해결된 것으로 확인된다.
또한 Immunity Debugger에서도 나오지않는 버그 이므로, 분석할 시 자신에 취향에 맞게^^ 사용하면 된다.

posted by 처리 

댓글을 달아 주세요