티스토리 뷰

바쁜 현대인을 위한 3줄 요약
  1. ptrace system call을 통한 디버깅 여부 확인
  2. 특정 함수에 시작위치에 0xCC가 존재하는지 확인
  3. 드디어 리눅스 악성코드들이 안티디버깅에 눈을 뜨기 시작함
간만에 리눅스 랜섬웨어가 접수되어 두뇌유희를 즐길 겸 디버거에 올렸다.



[그림 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 악성코드 판도 재밌는 판으로 만들어 줬으면 좋겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함