난독화 도구 : 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 문과의 연관성을 스스로 판단하는 과정이 있어 이에 따라 긍정/부정의 답을 내놓는 것으로 보임.