티스토리 뷰
- ptrace system call을 통한 디버깅 여부 확인
- 특정 함수에 시작위치에 0xCC가 존재하는지 확인
- 드디어 리눅스 악성코드들이 안티디버깅에 눈을 뜨기 시작함
[그림 1] 메인 함수
중간의 코드를은 언뜻봐도 "안녕 난 랜섬웨어고 이제부터 너희를 암호화 할꺼야" 라는 냄새를 폴폴 풍기고 있고 정작 눈을 사로 잡은건 위/아래쪽 빨간박스의 코드들이었다.
어떤 함수를 거치고 나와 그 결과에 따라 exit를 시켜버리다니.. 설마해서 분석을 시작했다.
sub_50091()
[그림 2] 디컴파일 한 sub_500091
sub_500091 함수를 디컴파일 해보면 위와 같은 코드가 나오는데.... 어떤 syscall number를 사용하는지 나오지 않는다. 해석이 잘못된것 같아 그냥 디스어셈블된 코드로 봤다
[그림 3] 디스어셈블 한 sub_500091
이제야 똑바로 나온다. 64비트에서 특정 시스템 콜을 호출할때는 rax에 Syscall Number를 넣어 사용한다. 위의 코드에 보면 rax 101 (0x65) 를 넣어주는데 이 값은 ptrace 시스템 콜을 의미한다. 나머지 파라미터들을 보면 모두 xor 함수를 사용해 0으로 초기화 해 주는데 이 값들을 실제 코드로 바꿔보자면 아래와 같다.
if (ptrace(PTRACE_TRACEME, 0, 0, 0) == -1)
{
return 0;
}
else
{
return 0x98BEC9B578B4FFD7;
}
즉 자기자신에게 디버거, 트레이서 (gdb, strace, 등은 모두 ptrace를 기반으로 동작한다) 등이 붙어있을 경우 0을 리턴해 주고 메인함수에서 값을 확인해 exit() 함수를 호출하는 형식으로 되어 있다.
※ ptrace : linux/unix 운영체제에서 특정 프로세스를 디버깅 하기 위해 사용하는 함수
(출처 : http://research.hackerschool.org/temp/ptrace.txt )
sub_5000DC
첫번째 이미지에서 나왔던 두번째 함수도 살펴보자. 첫 함수가 ptrace를 이용한 안티 디버깅 기법이므로 다음 함수도 안티디버깅 기법일꺼라 유추할 수 있다.
[그림 4] 디컴파일한 0x5000DC
익숙한 코드가 나왔다. 특정위치의 코드를 0xCC (BreakPoint)와 비교해 BP가 탐지될 경우 0을 반환하는 형식이다. BP탐지의 대상이 되는 함수는 sub_500091과 sub_5000DC 인데.. 이 두함수는 위에서 나왔던 ptrace 탐지 함수와 자기자신을 의미한다. 즉 안티 디버깅 우회를 위해 BP를 걸 경우 탐지하고 종료하게 된다.
이와 비슷한 코드를 어디선가 한번봤었는데...
[그림 5] 윈도우 악성코드에서의 BP 탐지
윈도우에서도 자주 사용되는 안티 디버깅 방식이다.
결론
IoT가 한참 뜨면서 언젠가 리눅스/유닉스 악성코드들도 안티디버깅을 가지는 시대가 오겠지 라고 생각하고 발표했던 적이 몇번 있었는데...이제 슬슬 시작되는게 아닌가 라는 생각이 든다. 아직은 기초적인 수준의 안티 디버깅이지만 언젠간 더 어려운 방법으로 악성코드를 무장하겠지..
어차피 이런 변화를 막을 순 없을테니 linux/unix 악성코드 판도 재밌는 판으로 만들어 줬으면 좋겠다.