실습3
if( eax >0 && ebx < 10 || ecx >= 2){
ebx =1;
} else{
ebx = 0;
}
알고리즘
1. 비교 eax와 0 비교
: eax가 0보다 같거나작을경우 (eax <=0) ecx를 비교하러 가야함.
1-1. (eax <=0)
ecx와 2 비교
: ecx가 2보다 같거나 크면 (ecx >=2) -> ebx = 1
아니면 ebx = 0
1-2. (eax >0)
-> ebx를 10과 비교
: ebx가 10보다 작으면 (ebx <10) -> ebx = 1
아니면 ecx 비교해야한다.
-> ecx 비교해서 2보다 크면 1
작으면 0
위의 C코드를 어셈블리 언어로 표현하면 아래와 같다.
(실습코드)
이 코드를 조금 더 간략하게 표현하자면 아래와 같이도 표현할 수 있다.
(실습 코드2)
그러면 우리가 만들었던 어셈블리 코드가 실제로 C코드를 컴파일한 코드와 비교해보자.
(C코드)
컴파일 후 어셈블리어 코드를 확인해보면
(어셈블리어 코드)
코드를 보면 우리가 만들었던 것과 조금 차이는 있지만 이 코드를 보고 우리가 어떤 식으로 동작하는지 이해할 수 있는 정도는 되었다.
이번에는 switch 문을 사용한 C코드를 컴파일한 어셈블리어를 if 코드와 비교해보겠다.
(switch문 사용)
컴파일 후 어셈블리어 코드 확인
(switch문)
코드를 보면 if문과 조금의 차이는 있지만 구조적으로 보면 jmp를 사용하기에
똑같다고 볼 수 있다.
이제 반복문을 알아보겠다.
반복문을 이용한 C코드를 컴파일해서 어떤식으로 이루어지는지 먼저 확인해보겠다.
(for문)
컴파일 후 실행해보면
(실행결과)
실행결과 우리가 생각하는 반복문 실행이 되는 것을 확인 할 수 있다.
이 코드를 어셈블리어를 확인해보면
(어셈블리어 코드)
반복문 또한 우리가 공부했던 jmp 분기문을 이용해 이루어지는 것을 볼 수 있다.
그렇다면 같은 내용을 while로 구현해보겠다.
(while 사용)
(어셈블리어코드)
어셈블리어 코드에서 보면 for문과 while 문의 차이는 없었다.
반복문은 jmp 분기문을 이용해 똑같이 만들어지는 것을 확인 할 수 있다.
그렇다면 직접 반복문을 만들어보자.!
아래와 같은 반복문을 만들것이다.
ebx = 0;
eax = 1;
while(eax <= 10){
ebx += eax;
eax++;
}
(실습 어셈블리어 코드)
'Hacking > System Hacking' 카테고리의 다른 글
(RootKit) LKM(Loadable Kernel Module) (0) | 2018.04.03 |
---|---|
malloc에서 사용하는 syscall (0) | 2018.02.21 |
System Hacking - jmp (분기문) (0) | 2017.04.18 |
System Hacking - 어셈블리어(사칙연산) (0) | 2017.04.14 |
System Hacking - 데이터 저장(메모리이용) (0) | 2017.04.13 |