조건문의 기본
if(x > 0x100){
printf("x > 100\n");
}
위 코드를 디스 어셈블하게 되면
00401024 cmp eax, 100h
00401029 jle 0x401038
0040102B push offset ax100 ; x > 100\n
00401030 call sub_401050
00401035 add esp, 4
00401038 pop ecx
00401039 retn
- jle는 왼쪽 인자(operand)의 값이 오른쪽 인자의 값보다 작거나 같으면 점프!
- eax(x)가 100보다 작거나 같으면 경우 점프
- eax(x)가 100보다 크면 0x40102B로 가서 "x>100\n" 을 출력한다
if(x == 0){
printf("x=0\n");
}
조건을 위와 같이 바꾸면
00401024 cmp eax, 100h
00401029 jnz 0x401038
0040102B push offset ax100 ; x = 100\n
00401030 call sub_401050
00401035 add esp, 4
00401038 pop ecx
00401039 retn
- 조건문의 인자가 바뀜에 따라 점프문이 jle에서 jnz로 바뀌는 것을 확인 할 수 있다!!
만약 중첩된 조건문이 들어올경우
if (x > 0x100) printf("x > 100\n");
else printf("x = else\n");
00401024 cmp eax, 100h
00401029 jle 0x40103A
0040102B push offset aX100 ; x > 100\n
00401030 call sub_401060
00401035 add esp, 4
00401038 pop ecx
00401039 retn
0040103A push offset aXElse ; x = else\n
0040103F call sub_401060
00401044 add esp, 4
00401047 pop ecx
00401049 retn
- 코드는 늘어난 것 처럼 보이지만 실제로는 출력문만 추가되고 분기에는 변화가 없다!!
- 만약 중첩 조건문에 if문이 추가될경우는
if (x > 0x100) printf("x > 100\n");
else if(x < 0x200) printf("x > 100 && x < 200\n");
else printf("x = else \n");
00401024 cmp eax, 100h
00401029 jle 0x40103A
0040102B push offset aX100 ; x > 100\n
00401030 call sub_401060
00401035 add esp, 4
00401038 pop ecx
00401039 retn
0040103A cmp eax, 200h
0040103F jge 0x401050
00401041 push offset aX100X200 ; x > 100 && x < 200\n
00401046 call sub_401070
0040104B add esp, 4
0040104E pop ecx
0040104F retn
00401050 push offset aElse ; else
00401055 call sub_401070
0040105A add esp, 4
0040105D pop ecx
0040105E retn
- cmp문 + 점프문으로 이뤄져 있으면 조건문이라는 것을 확인할 수 있다!!!
- 조건무 이후에 등장하는 별도의 조건 없이 무조건 점프하는 명령어는 else에 해당한다
- 만약 &&(and)문을 붙이면 어떻게 되는지 확인!
if (x > 0x100 && x <200) printf("x > 100\n");
else printf("x = else\n");
00401204 cmp eax, 100h
00401209 jle 0x401220
0040120B cmp eax, 200h
00401210 jnb 0x401220
00401212 push offset ax100 ;x > 100\n
00401217 call sub_401260
0040121C add esp, 4
0040121F retn
- 이번에는 cmp문 + 점프문 코드가 연속으로 등장하는 것을 확인 할 수 있다
- 조건문 이후 action이 나오느냐 나오지 않느냐가 핵심!!
'개인 공부 > 리버싱' 카테고리의 다른 글
Reverse Engineering-008(strcpy) (0) | 2023.04.23 |
---|---|
Reverse Engineering-008(반복문) (0) | 2023.04.19 |
Reverse Engineering-006 PE-01 (0) | 2023.04.17 |
Reverse Engineering-005 (0) | 2023.04.13 |
Reverse Engineering-004(C++) (0) | 2023.04.12 |