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문의 어셈블리 코드가 나타난다.
'Reverse Engineering' 카테고리의 다른 글
7. for 리버싱 for문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |
---|---|
6. 6개의 분기가 포함된 어셈블리어 코드 (0) | 2016.11.10 |
4. if 리버싱 (if문이 포함된 어셈블리어 코드) (0) | 2016.11.10 |
3. 구조체 출력 어셈블리어 코드 (0) | 2016.11.10 |
2. 지역변수 출력 어셈블리어 코드 (0) | 2016.11.10 |