본문 바로가기

Reverse Engineering

6. 6개의 분기가 포함된 어셈블리어 코드

6. 6개의 분기가 포함된 어셈블리어 코드

 

  

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

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

 

 

 

 

#include <stdio.h>


int main()

{

int lv = 2;

switch (lv) {

case 0:

printf("lv is 0 ");

break;

case 1:

printf("lv is 1 ");

break;

case 2:

printf("lv is 2 ");

break;

      case 3:

printf("lv is 3 ");

break;

case 4:

printf("lv is 4 ");

break;

default:

printf("default ");

}

return 0;

 

}

 

 

 

 

[발췌-수정]

if-else문과 다르게 먼저 default 점프문부터 나오게 된다. 013713EE 주소에서 지역 변수인 [EBP-8]에 2를 할당하고

013713FE 주소에서 4와 비교해 JA(jump if above) 명령어를 수행하게 된다.

01371405 주소의 JA 명령어는 [EBP-D0] 변수가 4보다 크면 default 코드로 점프한다.

 

[EBP-DO] 변수가 4보다 작을 경우 if-else문처럼 하나씩 비교하는 것이 아니라 01371411 주소의

 JMP DWORD PTR DS:[ECX*4+13714C4]

명령어에 의한 계산된 주소로 한번에 점프하게 된다.

 

이와 같이 분기가 많을 경우 switch-case문을 사용하면 모든 분기문을 거치지 않기 때문에

if-else 문보다 빠른 속도로 분기문을 실행하게 된다.