본문 바로가기

Assembly Reversing

Assembly Reversing(1~10)

 

 

 

 

int main(){

printf($sg2684)

}

※ 설명할 부분이 없다.. !

 

 


 

▶002. 변수형 개념 배우기

문제 : 변수 x에 1을 저장하고, 변수 y에 2를 저장하여, x와 y의 합을 z에 저장하는 프로그램을 작성하시오.

 

 

 

int main(){

int a = 2;

int b = 1;

int sum = 0;

 

sum = a+b;

printf("%d \n", sum);

return 0;

}

쉽다. !

 


 

▶003. 상수형 개념 배우

문제 : 정수형 상수 1과 실수형 상수 3.141592를 더하는 프로그램을 작성하시오.

 

 

 

 

소스 피연산자를 fpu 레지스터 스택에 푸쉬하는 것이다. (데이터 로드) 그렇다면 fpu 레지스터란 무엇인가.. cpu에서 지원하지 않는 부동소수점연산을 빠르게 처리하기 위한 프로세서 이다. 현대의 x86 프로세서는 모두 x87 FPU를 내장하고 있으나 80486 이전의 프로세서에서는 따로 분리된 프로세서였다고 한다.

 

# fstp란?

fst와 fstp는 데이터를 저장하는 역할을 한다. 둘의 차이는 fst는 기존 레지스터 내용을 유지하지만 fstp(pop)는 기존 레지스터의 내용을 pop합니다.

 

int main(){

double b;

b = 4.141592  //  여기서 X+PI의 add연산 과정이 안보이는데.. 이는 전처리기에 의해 이미 계산되어져있다.

printf("%f", b);

return 0;

}

 


 

▶004. 연산자 개념 배우기 + 비교문

문제 : 변수 x에 10을 대입하고 , x에서 5를 빼는 프로그램을 작성하시오.

 

 

 int main(){

int a;

int b = 10;

 

a = b - 5;

 

if ( a > b ){

printf(SG2687);    // a가 b보다 크니까 요놈을 출력함 ("x의 값이 y보다 큽니다.");

}else{

printf(SG2689);

}

return 0;

}

 

# 비교문은 머리속으로 계속생각하며 c언어로 바꾸는 연습을 계속하면 는다..

 


 

▶005. 조건문 개념 배우기 (if~ else)

문제 : 변수 x에 20을 대입한 후, x의 값이 y의 값보다 큰 경우에 "x의 값이 y의 값보다 큽니다."를 출력하고, x의 값이 y의 값보다 작은 경우 "x의 값이 y의 값보다 작습니다."를 출력하는 프로그램을 작성하시오.

 

 

 

int main(){

int a = 10;

int b = 20;

 

if( a < b ){

printf(SG2687);   // a의 값이 b의 값보다 작습니다.

}else{

printf(SG2689);   // a의 값이 b의 값보다 큽니다.

}

 

return 0;

}


▶006. 순환문 개념 배우기(for)

문제  : 1부터 10까지의 합을 구하는 프로그램을 작성하세요.

 

• int 
main(int arec, const char 
public _main 
maun 
proc near 
var 8 
var 
arec 
argv 
envp 
ebp, esp 
loc 2E: 
' loc 37: 
argv, 
const char 
*envp) 
dword 
dword 
dword 
dword 
dword 
push 
sub 
add 
cmp 
add 
mov 
Jmp 
ptr 
ptr 
ptr 
ptr 
ptr 
e bp 
esp, 
-4 
OCh 
1 Oh 
short loc 37 
eax, 
eax, 1 
eax 
eAh 
short loc 48 
ecx, 
ecx, 
ecx 
short loc 2E 
; CODE XREF: 
• CODE XREF: 
main•2Elj 
main.14tj

CODE XREF: 
edx, [ebp+var_a] 
edx 
offset $SG2689 
dword ptr 
esp. 8 
eax, eax 
esp. ebp 
ebp 
main+23 j 
ma i n 
push 
push 
call 
add 
pop 
endp 
ends

 

 

int main(){

int sum = 0;

int x = 1;

 

while(x < 10){

sum += x;

x++;

}

 

printf("1부터 10까지의 합은 %d \n", sum);

return 0;

}

 


▶007. 문자열 개념 배우기

문제 : "대한민국"을 출력하는 프로그램을 작성하세요.


int main(){

puts("대한민국");

return 0;

}

 

# 설명할게 없다...!


 

▶008. 함수 개념 배우기

문제 : 1~10까지의 합, 1~1000까지의 합을 구하는 프로그램을 작성하시오

 

1). 메인함수

# hapf 함수의 반환값을 printf함수 호출전에 레지스터에 저장하는 것을 확인.  

 

 

3) hex view

main() {
     printf("1부터 10까지의 합은 %d \n", hapf(10));
     printf("1부터 100까지의 합은 %d \n", hapf(100));
     printf("1부터 1000까지의 합은 %d \n", hapf(1000));
}

int hapf(int value) {
     int i;
     int hap = 0;

     for (i = 0; i <= value; i++) {
         hap = hap + i;
     }

     return hap;
}

# 흐름을 따라가면 쉽게 이해 가능하다.

 


9,10문제. 컴파일과 주석에대한 설명이므로 생략..
정보기 준비로 인해, 시험이 끝나고 추가적으로 업로드 하겠습니다. !

'Assembly Reversing' 카테고리의 다른 글

Assembly Reversing 공부법  (0) 2018.06.19