lyl -1부

2020. 4. 30. 15:100x02 Reverse Engineer/0x03. Etc

728x90

외국 생활하다 심심하여 오랜만에 오픈 채팅방에 들어갔다.

재밌는 바이너리를 올려주신 분이 계셔 분석을 해보았다.

해당 바이너리는 대전과학고 36기 Cy(이브이)님이 작성하셨다.

 


1. 계기

이유는 단순하다. 괴롭히기 위함이다. 잔인한 사람이었다.

 

2. 동적 분석

환경 : EXE (64bit)

Option 1 . 릴어를 한글로 번역

Option 2.  한글을 릴어로 번역

Option 3.  종료

제한 사항 : 단독 초성/종성 또는 문장부호는 현재 지원하지 않음.

 

* 특정 인덱스 이후 'ㄹ' 과 '닐'이 적힘을 확인할 수 있다.

 

3. 정석 분석

모든 분석은 x64dbg를 통해서만 이루어진다.

 

Enumeration

Main 함수 시작 주소 : 0x7FF7DE071450

암호화에 진행 되는 주요 연산 : shr, sar, imul

 

 

&std::basic_istream<char, std::char_traits<char> >::opertator>>>를 사용하는 것으로 보아 C++임을 짚고 넘어갈 수 있다. (왠지 괴랄한 코드들이 있을 수 있다고 추정하고 분석하였지만, 다행히 I/O만 C++을 이용하고 있다)

 

Case 2부터 분석하였다.

분석에 사용 된 테스트 케이스는 '연어'이다.

[연어가 먹고싶기 때문이다..]

싱가포르 더럽게 비싸다....

 

 

input_kor을 거쳐 연산에 쓰일 값(RAX)이 세팅되게 된다.

현재 RAX값은 C5F0 즉 '연'이다.

특이한 값들을 xmm0 / xmm1에 대입하는 것을 볼 수 있다. 분석하는데 큰 도움은 되지 않았던 녀석들이다.

[rbp+0x40] 위치에 0x16F를 강제로 집어넣고, 메모리 초기화를 진행한다.

그러면, 0x16F 영역을 제외하고 모두가 초기화된다.

초기화를 진행했다는 것은, 이제부터 본격적으로 괴롭히겠다는 뜻이다.

 

아래의 라운드는 EAX가 0x20이라는 값이 나올 때까지 반복된다.

즉, 라운드 2개의 연산을 거치게 되면 EAX가 유동적으로 변한다는 것을 알 수 있다.

라운드의 경계는 eax의 하드코딩을 기점으로 나누었다.

 

라운드 1-1.

[하드코딩된 값] : 0x24924925

[핵심 연산]

- sub, shr, imul

라운드 1-2.

[하드코딩 된 값] : 0xDEE95C4D, 0x30C30C31

[핵심 연산]

- shr, imul, sar

r15 : 2바이트당 카운터 1

즉, 연 => r15 =1

연어 => r15 = 2

각 바이트마다 똑같은 연산을 거친다는 것을 알 수 있다.

 

[rsp+rcx*4+20] 0x25
[rsp+rax*4+6C] 0x65
[rsp+rax*4-40] 0xC5

 

라운드 2-1.

[핵심 연산]

- sar, shr, imul

 

라운드 2-2.

[핵심 연산] sar, shr, shl, sub

 

 

라운드 3.

[핵심 연산] : r13+rax*4+0x1AA8

r13은 binary offet 0x00이다.

EBX가 B보다 작은지 체크한다.

EDI를 조건 비트로 설정하여, 0으로 떨어지지 않으면 라운드 2.2로 다시 이동하여 연산을 재개한다.

 

하드 코딩되어 있는 '릴' 친구들

For example

 

1부에서는 암호화 과정을 세분화하여 보다 빠른 분석이 될 수 있게 세팅해두었다.

2부에서 더 신랄하게 분석해보자.

'0x02 Reverse Engineer > 0x03. Etc' 카테고리의 다른 글

lyl -3부  (0) 2020.04.30
lyl -2부  (4) 2020.04.30
Rootme Prob . ELF x86 - KeygenMe  (0) 2020.02.06
KaKaoTalk MacOS Analysis  (0) 2020.01.26
HackCTF static  (0) 2019.07.25