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 문보다 빠른 속도로 분기문을 실행하게 된다.
'Reverse Engineering' 카테고리의 다른 글
8. while문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |
---|---|
7. for 리버싱 for문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |
5. switch문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |
4. if 리버싱 (if문이 포함된 어셈블리어 코드) (0) | 2016.11.10 |
3. 구조체 출력 어셈블리어 코드 (0) | 2016.11.10 |