* 컴파일한 어셈블리 코드는 컴파일러나 속성 등 여러 요인에 따라 많이 상이 할 수 있습니다.

우선 문자열 비교를 위한 코드는 아래와 같다. buf1 에는 "Compare" 라는 문자열을 저장해놓고 buf2 에는 사용자로부터 입력을 받도록 하였다. 그리고 strcmp 를 통해 두 값을 비교하는 코드이다. 

위 코드에서 strcmp 부분의 어셈블리 코드는 아래와 같다. 여기서 buf2 에 "Comparz" 를 넣어주므로 ARG.1 에는 "Compare", ARG.2 에는 "Comparz" 가 위치하게 된다. 눈으로 한번 살펴본 뒤 이에 대한 자세한 설명을 읽어보자.

우선 strcmp(buf1, buf2) 에서 buf1 은 "Compare" 이고 buf2는 "Comparz" 라는 문자열을 입력해주었다. 스택에 들어있는 각 문자열을 EDX 와 ECX 레지스터에 넣어준다.

첫 줄에서 EDX 에 있는 기준 문자열 4 Bytes 를 EAX 로 복사한다. 이를 통해 EAX 에는 0x706D6F43 이 오게 된다. 얼핏 보면 함수의 주소 같지만 "Comp" 라는 문자에 해당하는 ASCII 값이다. 두 번째 줄부터 CMP 명령어가 나타난다. CMP 명령어는 두 값을 비교할 때 사용되는 명령어이다. AL 은 EAX 의 하위 1 Byte 로 0x43("C") 가 된다. 이 "C" 와 사용자가 입력한 문자열("Comparz") 의 첫 번째 문자를 비교한다.


AL 과 ECX 의 첫 글자가 일치한다면 ZF 는 1로 설정되어 JNE 에서 점프하지 않는다. 그리고 TEST AL, AL 은 비교한 두 문자가 0 인지 확인하는 명령어로, 두 문자 모두 0 이라면 ZF 가 1로 설정되어 JZ 에서 점프하여 RETN 으로 간다.

위에서 AL, AH 를 통해 두 문자씩 비교를 하였다. 그렇다면 세 번째 문자부터는 SHR EAX, 10 을 통해 EAX 값을 정리해준다. SHR EAX, 10 는 EAX 레지스터의 값을 0x10 bit 만큼 우측으로 이동시키는 것으로 상위 2 Bytes 의 값이 하위 2 Bytes 에 자리 잡게 된다. 이 경우 "0x706D6F43" 이 "0x0000706D" 가 된다. 그리고 다시 AL 과 AH 를 통해 나머지 문자들도 비교한다.

기준 문자열이 4 Bytes 보다 크기 때문에 주소를 옮겨 주어야 한다. 따라서 ECX 와 EDX 에 있는 주소 값에 각각 4 를 더해 다섯 번째 문자를 가리키도록 한다. 그 후 다시 문자 비교를 시작하는 위치 0x62BEF950 으로 이동한다.

반복문을 돌면서 한 문자씩 비교하는 것을 확인하였다. 이번에는 반환 값에 대하여 알아보자. 아래 두 그림은 0 을 반환하는 경우와, 0 이 아닌 값을 반환하는 경우이다. 아래 첫 번째 그림은 XOR EAX, EAX 를 통해 EAX 의 값을 0 으로 만든다. strcmp 는 두 값이 같은 경우 0 이 반환되는 것으로 바로 그 부분이다.

SBB EAX, EAX 는 SUB EAX, EAX 와 유사하다. 다만 이에 Carry Flag(CF)의 값을 다시 빼준다. 따라서 EAX 에는 어떤 값이 있더라도 자기 자신을 소거한 뒤 CF 의 값에 따라 1을 더 빼주는 셈이 된다. SBB 명령어를 통해 0 또는 0xFFFFFFFF 가 된 EAX 에 OR EAX, 0x1 을 해주므로 결국 EAX 에는 1 또는 -1 이 반환된다.

좀 더 구체적으로 1 또는 -1 은 마지막 CMP 명령어에서 결정된다. 기준 문자열의 마지막 문자 'e' 와 비교 문자열의 'z' 를 비교했을 때, 각각의 ASCII 값은 0x65 와 0x7A 이다. '기준 문자 < 비교 문자' 인 경우 CF 는 borrow 가 발생하여 1로 설정된다. 이 경우 최종적으로 반환되는 값은 -1 이 된다. 반대로 비교 문자열이 "Compara" 라 할 때, 마지막 문자 'a' 는 'e' 보다 작은(기준 문자 > 비교 문자) 값이므로 borrow 가 발생하지 않아 CF 가 0으로 설정되어 최종 반환 값은 이에 OR 1 을 하여 1 이 된다.

'Reversing > Theory' 카테고리의 다른 글

암호학 기초 개념  (2) 2016.11.23
Memory Detection(메모리 진단)  (0) 2016.09.26
WFP 무력화  (0) 2016.06.21
DLL이란?  (4) 2016.05.29
PE구조의 이해  (0) 2016.05.04