본문 바로가기

개인 공부/리버싱

Reverse Engineering-007 PE-02(PE-01추가 & 조건문)

조건문의 기본

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