본문 바로가기

System Hacking

7일차] 분기문(if, switch)

[ cmp: compare ]

- 레지스터나 메모리의 값을 변경하지 않는다.

- 플래그 레지스터에만 영향을 준다.

- SF(Sign Flag), CF(Carry Flag), ZF(Zero Flag)

- cmp left, right ( left - right )

 

1). 결과가 0인 경우 : 같다. ( ZF: 1, SF: 0 )

# 8번째 비트(SF)가 0, 7번째 비트(ZF)가 1인 것을 확인할 수 있다.

# 지금 쓰고있는 체제에서는 flag를 확인할 수 있는 방법은 pushfd를 통해서 7번째비트(ZF)와 8번째비트(SF)를 확인해서 알아야 한다.

 

2) 결과가 음수인 경우: right가 더 큰 경우 ( ZF: 0, SF: 1 )

#8번째 비트(SF)가 1, 7번째 비트(ZF)가 0인것을 확인할 수 있다.

 

 

3) 결과가 양수인 경우: left가 더 큰 경우 ( ZF: 0, SF: 0 )

# 8번째 비트(SF)와 7번째 비트(ZF)가 0인것을 확인 할 수 있다.

 

[ 분기문 ]

1). 무조건 분기문: jump

 - jmp <addres>

# 위와같이 branch라는 레이블(주소)넣어주고 jmp <addres>를 입력해주면 jmp명령어와 해당 addres사이의 명령어는 점프하고 해당 주소의 명령어부터 실행 한다. eax는 출력하지 않고 점프된 것을 확인할 수 있다. c언어의 go-to와 비슷하다. (잘 사용되지 않음 위험성)

 

2). 조건 분기문

조건 분기문은 말 그대로 C언어의 if와 같은 역할을 한다.

Jump Above 양수일 경우 조건문을 실행이다.

Jump Below 음수일 경우 조건문을 실행한다.

Jump Equal 같을 경우 조건문을 실행한다.

 

[실습] make it to assembly!  

if( 100 <20 ) {

printf("less \n")

}else

pirntf("greater \n")

 

[실습]

1. if (eax == 0 && ebx >= 1 && ecx < 2) edx = 1  else edx = 0

 

 

 

if문이 제대로 적용되는 것을 확인 할 수 있다.

 

 

2. if (eax ==0 || ebx >= 1 || ecx < 2) edx = 1 else edx =0

 

 

 

if문이 제대로 적용되는 것을 확인 할 수 있다.

 

3. if ( ( eax == 0 && ebx >= 1 ) || ecx < 2 ) edx = 1 else edx = 0

첫번째 실행결과는 (eax == 0 && ebx >=1) 은 맞지만 ecx < 2 는 틀렸다 하지만 or이기 때문에 참으로 결과가 1이나온다.

두번째 실행결과는 (eax == 0 && ebx >=1) ,ecx < 2 둘다 틀렸다 따라서 0이 나온다.

세번째 실행결과는 (eax == 0 && ebx >=1) 은 틀리지만 ecx < 2 는 참이다. 따라서 or이기때문에 결과가 1이 나온다.

 

세번째 문제는 이런식으로 레이블을 여러개 두어서 해결할 수 있다. 분기문을 이해한다면 반복문은 쉽게 이해할 수 있다.

 

 

'System Hacking' 카테고리의 다른 글

9일차] 스택 메모리, 함수  (0) 2018.05.17
8일차] 반복문(for, if)  (0) 2018.05.17
6일차] 비트연산자, 논리연산, 형변환  (0) 2018.05.16
5일차] 연산자 (사칙연산)  (0) 2018.05.15
4일차] 명령어(mov, lea)  (0) 2018.05.14