Switch Detect

안상준·2025년 3월 13일

Virtualize Deobfuscator

목록 보기
2/14

switch assembly code analysis

vm난독화 구조에서 while문 안의 switch문이 사용되는 것이 일반적인 방식이다.
vm의 인터프리터는 일반적으로 무한루프 내에서 바이트코드를 분석한다. 각 바이트코드는 특정 명령어를 나타내며 switch문을 이용하여 해당 명령어에 맞는 처리를 수행하게 된다.
해당 구조를 파악하게 된다면, 각 명령어가 어떻게 처리되는지 파악할 수 있다.

switch in assembly

switch문을 컴파일 하면 두 가지 방식으로 switch문을 어셈블리 코드로 표현이 된다.

switch with if



c코드를 어셈블리 코드로 컴파일하고 main부분을 캡처한 사진이다. switch문 이지만 cmpl, je를 이용하여 비교하고 분기하는 부분을 볼 수 있다. 즉, switch문을 if를 이용하여 구분했다고 볼 수 있다.

switch with jump table



이번에는 이전보다 case문을 증가시켜 보았고, 컴파일 결과 이전과 달리 jmp *%eax를 통해 분기하는 것을 볼 수 있었다.

정리

switch문을 구현하는 방식은 상황에 따라 다르다. 실험 결과 같은 코드로 다른 아키텍처에서 컴파일 해 보았지만 arm아케텍쳐에서는 if를 사용하였고, x86에서는 jump table을 사용하는 것을 확인할 수 있었다. 아키텍쳐, 컴파일러, switch 구조에 따라 switch를 구현하는 방식이 다르다는 것을 볼 수 있었다.

how to detect switch

jump table


ida를 이용하여 jump table을 사용한 실행파일을 분석해 보았다.

main의 시작부분이며 처음 시작하는 베이직 블럭에서 switch case에서 default인지 아닌지를 확인하여 분기하게 된다.

default가 아닌 경우에는 jump table에서 주소를 가져와 eax에 저장후 jmp eax가 실행되게 된다.

cmp jmp

이번에는 위와 같은 case 수지만 불연속 적인 값을 사용했을 때의 결과이다.


jump table을 사용하지 않고 if문을 반복적으로 사용한 것을 볼 수 있다.

정리

만약 switch가 jump table을 사용 했더라면 switch detect는 문제가 없을 것 같다. 하지만 switch문이 if문 구조로 돼 있다면 상당히 어려울 것 같다.

  • 방법 1: 분기된 후 모이는 지점을 통한 탐지
    jump table, if문 구조 모두 문기 후 한 곳으로 모이게 된다.

    해당 사진처럼 jmp short loc_401560을 반복적으로 사용하는 것을 볼 수 있다.
    하지만 이는 반복적인 if, else-if 구조와 분간하기는 매우 어렵다고 생각한다.

  • 방법 2: 분기사용 패턴을 탐지

위 사진은 불연속적인 switch case문을 ida로 분석한 사진이다. 약간 tree의 모양을 하고 있는 것을 볼 수 있다. 현재 사용한 case는 5개 이다.

case를 6개로 늘리고 확인해 보았다. 빨간색 동그라미 친 베이직 블럭이 추가된 것을 볼 수 있다.

그 다음은 case를 7개로 증가시키고 확인해 보았고, 빨간 동그라미 부분이 추가된 것을 볼 수 있었다.
다른 여러 코드의 switch문도 확인해 볼 필요가 있지만 switch코드가 일정한 규칙에 의한 control flow가 생성이 된며, 이를 코드(assembly)로 분석이 가능하다면 switch detect가 가능할 것 같다.

  • 방법 3: control flow를 통한 탐지

    처음부터 if문이었던 코드인데 각 분기된 베이직 블럭을 보면 _case_ 함수를 순서대로 왼쪽부터 오름차순으로 call 하는 것을 볼 수 있다.

    이는 assembly코드로 봐도 동일한 것을 볼 수 있다.
    이에 반면 switch문의 경우

    _case_함수의 번호가 뒤죽박죽인 것을 볼 수 있었다. 만약 다른 switch, if문에서도 동일한 control flow라면 switch를 탐지할 수 있지만 이는 원본 코드를 알고 있는 상황에서 사용할 수 있는 방법인 것 같다.

0개의 댓글