#1 : http://redscreen.tistory.com/66

#2 : http://redscreen.tistory.com/67

#3 : http://redscreen.tistory.com/68

#4 : http://redscreen.tistory.com/71

 

------------------------------------------------------------------------------------------------------------------------------------------

7. Strings 윈도우를 이용해 디스어셈블리 내의 문자열 \cmd.exe /c를찾아보자. 어디에 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

View > Open Subviews > Strings 를 선택하여 해당 문자열을 찾습니다. (Shitft + F12)

맨 아래부분에서 발견 가능하고, 더블클릭하면 섹션과 주소값을 알아낼 수 있습니다.

답 : xddors_d 섹션 / 0x10095B34

 

 

------------------------------------------------------------------------------------------------------------------------------------------

8. \cmd.exe /c를 참조하는 코드 영역에서 무슨 일이 발생하는가?

------------------------------------------------------------------------------------------------------------------------------------------

해당 메소드가 어떤 기능을 하는지 알아내기 위해 해당 문자열을 더블클릭합니다.

이후에 문자열의 주소를 클릭하고 상호참조 리스트를 호출합니다. (Ctrl+X)

결과는 아래와 같이 단 한곳에서 호출함을 알 수 있습니다.

gethostbyname처럼 여러군데에서 호출되지 않으니

한군데만 확인하면 어떤 기능을 하는지 확인할 수 있다는 단서를 제공합니다.

 

또한 해당 코드영역을 더 살펴보면

"Hi, Master..."

"Welcome Back...."

"Encrypt Magic Number For This Remote Shell Session..."

등등의 백도어에서 원격 접속 시 사용될 것 같은 문자열이 있습니다. 

 

CMD창을 이용하여 명령어를 입력할 가능성이 있음을 기억해둡니다.

그리고 아까 상호참조를 타고 그래프 뷰로 넘어가서 화살표를 따라 쭉쭉 내려가면

"quit", "exit", "cd" 와 같은 문자열과 함께 memcmp 함수를 발견할 수 있습니다. 

 

책에서 memcmp를 볼 수 있을거라고 매우 쉽게 설명되 있지만, 

저는 아직 숙련되지 않기도 했고, 그래프가 크게 느껴져서  삽질을 좀 많이

빨간색(FALSE), 초록색(TRUE), 파란색(무조건) 화살표의 의미를 생각하며 그래프를 타고 내려가면

그래프 오버뷰의 중간 부분에서 memcmp가 반복 됩니다.

CMD에서 명령어를 입력할때마다 memcmp함수로 어떤 명령인지 비교하는 코드겠구나..라는 생각이 들었습니다.

답 : 원격 세션 생성

 

 

------------------------------------------------------------------------------------------------------------------------------------------

9. 같은영역 0x100101C8에서 dword_1008E5C4는 경로를 지정하는 전역 변수로 보인다.

    악성코드는 어떻게 dword_1008E5C4를 설정하는가? (힌트 : 상호참조 이용)

------------------------------------------------------------------------------------------------------------------------------------------

주어진 x100101C8 주소로 넘어가면 dword_1008E5C4값이 나옵니다.

 

해당 전역변수를 더블클릭하면 .data 섹션으로 넘어가게 되는데,

그곳에서 상호참조 리스트를 확인하면 아래와 같이 3가지가 나옵니다.

 

전 포스팅에서 살펴보았듯이 R Type은 읽기만 할뿐이고,

수정하는 부분은 맨위의 W Type 하나뿐이므로, 해당 부분을 살펴보면 어떻게 무슨값을 설정하는지 알 수 있겠군요.

OK를 누르고 해당 주소지로 이동하면, 아래와 같이 sub_10003695의 리턴값인 EAX를 이용하여

전역변수에 값을 할당하는 것을 볼 수 있습니다.

 

그렇다면 sub_10003695는 무엇을 하는 서브루틴일까요?

더블클릭하여 이동하면 아래와 같이 GetVersionExA 함수를 사용하는 소스임을 알 수있습니다.

아래 소스코드가 한눈에 파악이 안되어, Syntax부터 살펴보기로 했습니다.

 

GetVersionExA API의 SynTax는 아래와 같고, lpVersionInfo 파라미터를 넣어줘야 합니다.

push eax 를 이용하여 파라미터를 넣어주었고, GetVersionExA API로 버전값을 알아낸 것으로 보입니다.

 

이후에 VersionInformation 내부의 dwPlatformId 값이 2인지 CMP 명령어를 이용하여 비교를 하게 되는데,

참고로 dwPlatformId는 아래와 같이 윈도우 버전에 관련된 변수입니다.

 

두값이 같을 경우, CMP명령어의 결과는 0이되고 제로플래그(ZF)가 1로 세팅됩니다.

ZF가 1이라면 SETZ 명령어에 의해 AL(EAX의 하위 8비트)가 1로 세팅됩니다.

 

정리하면, Windows 계열인 경우 서브루틴 sub_10003695가 1을 리턴할 것이고,

리턴되는 값이 dword_1008E5C4 값에 저장될 것입니다.

답 : 운영체제 버전 저장

 

--------------------------------------------------------------------------------------------------------------------------------------------------

Tip. CMP 그리고 JUMP (JA vs JB vs JE vs JZ)

1) CMP

CMP는 묵시적으로 Op1(Destincationm, 피연산자)에서 Op2(Source, 소스피연산자)와의 뺄셈을 수행 ex) CMP Op1, Op2

그리고 어떤 피연산자도 수정되지 않지만, 뺄셈을 수행하다보니 플래그를 수정합니다.

- Op1 - Op2 < 0, ZF=0 CF=1

- Op1 - Op2 > 0, ZF=0 CF=0

- Op1 - Op2 = 0, ZF=1 CF=0

2) JUMP

JMP와 관련된 명령어는 매우 많지만 이번 문제에서 자주 쓰이는 Jump 명령어를 정리합니다.

- JA : Jump if Above / CMP로 두 값을 비교하여 Op1(왼쪽) 크면 Jump  /  ZF = 0  and  CF = 0

- JB : Jump if Below / CMP로 두 값을 비교하여 Op2(오른쪽) 크면 Jump  /  CF = 1

- JE : Jump if Equal / CMP로 두 값을 비교하여 Op1, Op2 값이 같으면 Jump  /  ZF = 1

- JZ : Jump if Zero / 결과값이 0이면 Jump / ZF = 1

- JNZ : Jump if not Zero / 결과값이 0이 아니면 Jump / ZF = 0

 

Tip. CMP 이전에 수행하는 XOR EAX, EAX 명령어

XOR 명령어는 Overflow와 Carry 플래그를 항상 0으로 해제합니다.

또한 EAX는 서로다른 값일때만 1로 세팅되므로,

XOR EAX, EAX를 수행할 경우, 서로가 같은 값을 가지므로 0으로 초기화됩니다.

한마디로 CMP이전에 수행되는 해당 명령어는 청소도구라고 생각하면 되겠네요!

 

Tip. 함수에서 돌아온 이후 수행하는 TEST EAX, EAX 명령어

예를들어, memcmp 함수가 수행된 이후에 TEST EAX, EAX를 수행한다면 어떤 의미일까요?

TEST 명령어는 묵시적으로 두 피연산자의 대응되는 각 비트 쌍에 대해 AND 연산자를 수행하고,

결과에 따라서 플래그를 설정합니다. 또한 TEST 명령어는 연산자에 어떤 영향을 주지 않습니다.

하지만 이러한 글을 다 기억하는 것보다는, 자주 쓰이는 사례의 의미를 기억하는게 더 효율적이겠지요.

- CMP명령어는 두 OP가 동일한지를 판단하며

- TEST명령어는 두 OP가 모두 0인지 판단합니다.

즉 위에서 예로든 memcmp 함수가 시행된 이후에 EAX값에 리턴값이 설정되어 있을것이고

TEST명령으로 해당 값이 0인지 확인하는데 사용됩니다.

즉, memcmp로 비교한 문자열이 동일한가? 라는것을 TEST 명령어로 체크하는겁니다.

--------------------------------------------------------------------------------------------------------------------------------------------------

posted by Red_Message