카테고리 없음

LLM switch문 탐지 여부 분석 - Vitualize + a

snejs 2025. 5. 9. 14:02

난독화 도구 : tigress 

  • Environment : x86_64, Linux, Gcc

난독화 기법 : Virtualize + [ EncodeLiterals, OpaquePredicate, Split ]

사용한 코드 : 

test_loops_arrays.c
test_recursion.c
test_struct.c
test_file_io.c
test_multithreading.c

 

LLM : Claude 3.7

질문 내용 : 이 코드는 switch 문을 사용했니? 예 아니오로 답하고, 근거를 들어줘.

 


분석 결과

Virtualize만 적용했던 난독화 코드를 기준으로 각각의 난독화를 중첩했을 때 Claude가 대답한 결과이다.

 


Claude 대답 분석

 

test_struct.c - Vitualize + EncodeLiterals 

주요 사유 : Jump Table과 switch 문 간의 연결 실패

Jump Table을 사용하여 구현한 것은 분석해냈으나 그 구현이 switch문을 사용한 것에 대해 연결짓지 못해 아니오 라고 답한 것으로 추정됨.

 

(같은 난독화를 적용한) 다른 코드에 대해서 Jump Table을 동일하게 분석해내고 switch문과 연결지어 "예" 라고 답한 경우

 

두 사례를 바탕으로 Claude는 Jump Table과 switch 문 두 가지를 별개로 두고 'switch 문을 컴파일 시 일반적으로 Jump Table을 사용한다'는 추정을 하고 있는 것 같다.

 


test_recursion.c - Vitualize + Opaque Predicate

주요 사유 : if-else 분기 구조 사용

 


test_recursion.c - Vitualize + Split

주요 사유 : 연속된 if-else 분기 구조 사용하고 있으나 명시적인 switch 문(Jump Table 구조)을 찾을 수 없음

 

 


test_multithreading .c - Vitualize + Split

주요 사유 : 연속된 if-else 분기 구조 사용하고 있으나 명시적인 switch 문(Jump Table 구조)을 찾을 수 없음

특이사항 : 생성된 바이너리 코드의 길이 문제로 일부 잘라서 입력하였다. 이로인해 처음 Claude에게 코드를 제공할 때 일부 잘린 코드가 있었으며, 이를 다시 제공하니 if-else 분기 구조로 분석하던 코드를 Jump Table 구조를 사용한 코드로 재해석한 결과를 받았다.

 

생략되었던 코드 부분 : Jump Table 부분이 거의 생략되어 입력됨.

	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L21-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L20-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L19-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L18-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L17-.L14
	.long	.L16-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L39-.L14
	.long	.L15-.L14
	.long	.L13-.L14
	.text
.L12:
	subl	$3, %eax
	cmpl	$39, %eax
	ja	.L39
	movl	%eax, %eax
	leaq	0(,%rax,4), %rdx
	leaq	.L24(%rip), %rax
	movl	(%rdx,%rax), %eax
	cltq
	leaq	.L24(%rip), %rdx
	addq	%rdx, %rax
	notrack jmp	*%rax
	.section	.rodata
	.align 4
	.align 4
.L24:
	.long	.L32-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L31-.L24
	.long	.L30-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L29-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L28-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L27-.L24
	.long	.L26-.L24
	.long	.L25-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L39-.L24
	.long	.L23-.L24
	.text
.L11:
	cmpl	$92, %eax
	je	.L33
	jmp	.L39
.L19:
	movq	-640(%rbp), %rax
	addq	$1, %rax
	movq	%rax, -640(%rbp)
	movq	-640(%rbp), %rax
	movq	-632(%rbp), %rdx
	addq	$16, %rdx
	movl	(%rax), %eax
	movl	%eax, (%rdx)

 

 

 


결론

Claude는 if-else 구조를 switch 문과의 연관성이 낮다고 보는 것으로 보이며, if-else 구조인가 혹은 Jump Table 구조인가가 switch 문 분석 결과에 중심적인 사유가 되는 것으로 판단됨.

또한, Jump Talbe이 사용된 것으로 판단되는 코드임에도 해당 코드와 switch 문과의 연관성을 스스로 판단하는 과정이 있어 이에 따라 긍정/부정의 답을 내놓는 것으로 보임.