Assembly Language - compare
cmp A, B // A와 B의 크기를 비교하는 Assembly Language입니다.
이때 단순히 비교하는구나 보다 어떻게 비교하는지에 대해 알고 넘어가는 것이 중요합니다.
컴퓨터는 단순하기 때문에 단순한 방법으로 비교하는데 A-B를 하여 양수가 나오면 A가 음수가 나오면 B가 0이 나오면 같다고
판단합니다.
그렇다면 A-B를 하는 것하고 다른게 뭐냐?! 라는 질문이 나올 수도 있는데 sum A, B 라는 명령어를 사용하면 A-B의 결과가 A에
들어가게 되는 반면에 cmp 명령어는 따로 결과를 저장하지 않고 Register 중에서 EFLAGS를 사용하게 됩니다.
Register - EFLAGS
EFLAGS는 "0과 1로 이루어진 깃발" 정도로 이해하면 되며 전체 32 bit 이며 각 깃발이 표현하는 것은 0과 1이므로 총 32개의 깃발이 존재합니다.
하지만 ollydbg의 경우 Reversing에 필요한 8가지 정도만 보여주고 처음에 꼭 기억해야하는 것은 3개 정도입니다.
① C - CF(Carry Flag)
1 - 4 = 3 이라는 연산은 사람에게는 매우 쉽지만 실제 컴퓨터는 00000001 - 00000100 이므로 그냥은 계산할 수 없습니다.
그러므로 모자라면 빌려오고 CF 깃발을 올려서(1) 1 00000001 - 00000100 으로 계산하게 됩니다.
즉 CF = 0 내려가면 -> 빌려오지 않은 것이고, CF = 1 올라가면 -> 빌려서 계산한 것이라고 생각하면 됩니다.
② Z - ZF(Zero Flag)
0인지를 확인하는 깃발로 연산의 결과가 0이면 깃발을 올립니다(1), 또한 연산의 결과가 0이 아니라면 깃발을 내립니다(0).
즉 깃발이 내려갔다는 것(0)은 "두 값이 다르다!!" 라는 의미이고 깃발이 올라갔다(1)라는 것은 두 값이 같다! 라는 의미라고 생각하면 됩니다.
③ S - SF
이 깃발에 대해서는 이 페이지의 예제에서는 따로 사용할 필요가 없기 때문에 나중에 다시 설명하도록 하겠습니다.
이제 ZF와 CF를 활용하여 크기 비교를 해보도록 하겠습니다.
1-4 ==> ZF=0, CF=1 => 앞의 것이 뒤의 것보다 작다. 즉 1<4
1-1 ==> ZF=1, CF=0 => 앞의 것과 뒤의 것은 같다. 즉 1==1
4-1 ==> ZF=0, CF=0 => 앞의 것이 뒤의 것보다 크다. 즉 4>1
Assembly Language - J?, J?? 조건 분기 : 기준은 앞의 Operand라고 생각하시면 됩니다.
"cmp는 깃발을 바꾸고 J~문은 깃발만 본다!" 라는 말을 기억하고 적용에 들어가보도록 하겠습니다.
JGE(Jump if Greater than or Equal) : 앞의 operand가 뒤의 operand보다 같거나 크면 분기를 하라는 명령어입니다.
즉 바로 위에서 배운 EFLAGS를 적용해보면 CF=0, ZF=0 이거나 CF=0, ZF=1 이면 분기합니다.
'Security > RCE' 카테고리의 다른 글
(이론 01) PE File Format (0) | 2013.08.14 |
---|---|
(Manual Unpacking 01) UPX Unpacking (0) | 2013.08.14 |
(분석 01) WinSock 기초 분석 (0) | 2013.06.14 |
01 WinSock Basic (0) | 2013.06.11 |
(분석 01) Multi Thread 분석 (0) | 2013.06.01 |