카테고리 없음

리버싱 입문 Day 9 - [리버싱] virus1.exe 분석 - 문자열 검사 흐름 따라가기

baa1983 2026. 4. 18. 16:13

 

어제 바이러스와 유사한 형태의 virus.exe 파일을 한 번 분석해봤다.

현재는 기드라 정적 분석도 완전히 익숙한 단계는 아니기 때문에,
x64dbg를 이용한 동적 분석까지 무리하게 진행하는 건 아직 시기상 이르다고 판단했다.

그래서 기존에 보던 방식과 유사한 구조를 가진 파일을 직접 만들어보고,
그걸 다시 분석하는 방향으로 접근해봤다.

겉으로는 비슷한 성격의 악성코드를 모방한 형태지만,
내부 구조는 이전에 보던 것과는 조금 달라서
생각보다 분석하는 과정에서 여러 번 막히는 부분이 있었다.


1. main 함수 흐름

초반 부분은 크게 의미 있어 보이지는 않았고,
중간부터 문자열 관련 로직이 보이기 시작했다.

MOV EAX, [initialized]
XOR EAX, 0x11
ADD [RBP + local_c], 0x1
TEST AL, AL

여기서 눈에 들어온 건
→ XOR 0x11

단순 비교가 아니라
값을 한 번 변형해서 쓰는 구조 같았다.


2. 문자열 길이 검사

CALL strlen
CMP RAX, 0x2
JBE ...

→ 문자열 길이가 2 이하이면 분기

이 부분은 비교적 단순해서
“입력값 길이 제한이 있다” 정도로 이해했다.


3. 문자 비교 구간 (중요)

MOVZX EAX, byte ptr [RBP + local_58]
CMP AL, 0x74  ; 't'
JNZ ...

MOVZX EAX, byte ptr [RBP + local_54]
CMP AL, 0x65  ; 'e'
JNZ ...

이 부분은 꽤 명확했다.

→ 특정 위치 문자 비교
→ 't', 'e' 체크

그래서 단순하게 생각하면
입력값 안에 특정 문자열 패턴이 있어야 통과하는 구조 같다.


4. verify 함수

CALL strlen
CMP RAX, 0x6

→ 길이 6으로 제한

그리고 이후에

CMP AL, 0x52  ; 'R'
CMP AL, 0x31  ; '1'

이런 식으로 문자 비교가 이어진다.

여기까지 보면
완전히 랜덤 값이 아니라
어느 정도 정해진 문자열 구조가 있는 것 같다.


5. 입력값 변형

XOR EAX, 0x23

이 부분은 아직 정확히 연결은 못했지만,

→ 입력값을 그대로 쓰지 않고
→ XOR로 변형해서 비교하는 느낌

 


6. 아직 헷갈리는 부분

이건 일부러 남겨둔다.

  • XOR 이후 값이 어디서 어떻게 쓰이는지 정확히 연결이 안 됨
  • verify에서 사용하는 값들이 어디서 오는지 흐름이 애매함
  • noise_sum 부분은 뭔가 더해서 비교하는 것 같은데 확신 없음

아직은 “감으로 이해한 상태”라
다시 한 번 더 분석해볼 예정


7. 정리

이번 분석에서 느낀 건

  • 단순 비교보다 “변형 후 비교(XOR)” 구조가 많이 나온다
  • 문자열 길이 + 특정 문자 조건이 같이 붙는다
  • 완벽히 해석하려 하기보다 “흐름” 먼저 보는 게 더 중요한 것 같다

아직 부족한 부분이 많지만
그래도 처음보다 코드가 조금씩 눈에 들어오기 시작했다.

다음에는 verify 부분을 조금 더 깊게 파볼 생각이다.