본문 바로가기

Reverse Engineering

5. switch문이 포함된 어셈블리어 코드

5. switch문이 포함된 어셈블리어 코드

 

  

 본 포스팅의 내용은 해킹 맛보기 책의 내용중 3장 리버스 엔지니어링 P133~P281 까지

 실습 내용을 따라하기 해보았습니다. 책의 내용중 일부 발췌 (수정) 하였습니다. 문제가 될 때는 비공개 하도록 하겠습니다.

 

 

 

 

#include <stdio.h>


int main()

{

int lv = 2;

switch (lv) {

case 0:

printf("lv is 0 ");

break;

case 2:

printf("lv is 2 ");

break;

default:

printf("default ");

break;

}

return 0;


}

 

 

[발췌-수정]

00CD13EE 주소에서 지역변수인 lv([EBP-8])에 2를 할당하고 , 00CD13F5 주소에서 CMP 명령어로 0 과 먼저 비교한다.

00CD1405 주소에서 JE(jump if equal) 명령엉에 의해 0이면 점프한다.

그 다음에 00CD140E 주소의 JE 명령어는 2이면 점프하게 된다.

마지막에 나온 00CD1410 주소의 JMP(jump) 명령어는 EFLAGS 레지스터와 상관없이 무조건 점프하는 명령어다.

C 소스에서는 default 에 해당한다.

 

어셈블리어를 보면 if-else 분기문과 다르지 않다. 이론적으로 switch문을 쓰면 if-else문 보다 속도가 빠르다고 한다.

하지만 앞의 어셈블리 코드를 봐서는 이 경우에 차이가 없음을 알 수 있다.

분기가 존재하면 switch문의 어셈블리 코드가 나타난다.