006.



#include <stdio.h>
main()
{
int i;
int hap = 0;
for( i = 1; i <= 10; i = i + 1 )
{
hap = hap + i;
}
printf( "1부터 10까지의 합: %d", hap );
}








'리버싱 > C언어 300제' 카테고리의 다른 글

리버싱 - c언어(001-005)  (0) 2018.12.13

001. c 프로그램 시작하기.

#include <stdio.h>
void main()
{
printf("안녕하세요."); // '안녕하세요' 출력
}



PUSH EBP

MOV EBP, ESP // 스택에 공간 확보

-----------------함수 프롤로그 ------------------

PUSH c_pro.004020F4 // c_pro.004020F4를 스택에 넣기

CALL DWORT PTR..... // printf함수 호출

------------------------------------------------

ADD ESP,4 // 사용한 스택없애주는 (ESP를 내리므로써 사용한 값이 들어있는 스택을 쓰레기값으로 만든다)

XOR EAX,EAX // EAX는 리턴값을 반환하는 데 사용하는 것. 메인함수의 일이 끝났으니 반환값이 들어있는 EAX를 XOR연산을 이용하여 0으로 초기화.

RETN

--------------- 함수 에필로그 --------------------



002.


#include <stdio.h>
void main()
{
int x;
int y;
int z; // 변수 생성
x = 1;
y = 2; // 변수의 값 입력
z = x + y;
printf( "%d", z ); // z의 값을 출력
}





PUSH EBP

MOV EBP,ESP // 함수의 프롤로그 SUB ESP,0C // 변수선언을 위해 스택에 공간확보 (변수가 3개이며, 스택은 4byte 간격이기에 12byte확보 위해 hex 0C를 스택에 확보) MOV DWORD PTR SS:[EBP-8],1 // [EBP-8]은 변수 x의 공간이므로, 1을 넣음 MOV DWORD PTR SS:[EBP-4],2 // [EBP-4]는 변수 y의 공간이므로, 2를 넣음. MOV EAX,DWORD PTR SS:[EBP-8] // [EBP-8]에 있는 1을 EAX에 넣음. ADD EAX,DWORD PTR SS:[EBP-4] // [EBP-4]에 있는 2를 EAX에 더함. 따라 2+1은 3 MOV DWORD PTR SS:[EBP-C],EAX // EAX에 있는 3을 [EBP-C]에 넣음. MOV ECX,DWORD PTR SS:[EBP-C] // [EBP-C]에 있는 3을 ECX에 넣음. PUSH ECX ; /<%d> // ECX에 있는 3을 스택에 넣음. PUSH c_pro.004020F4 ; |format = "%d" CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf ADD ESP,8 // printf에 사용한 스택공간 버리기 (함수의 에필로그) XOR EAX,EAX // EAX 0으로 초기화

MOV ESP,EBP // ESP를 EBP와 같은 값으로 넣음으로써, 계산에 사용된 스택공간 버리기 POP EBP // EBP 스택에서 버리기. RETN



003.


#include <stdio.h>
#define X 1
#define PI 3.141592
int main()
{
double z;
z = X + PI; // 위에서 정의한 X와 PI의 값을 더하여 저장하는 변수
printf( "%f", z ); // 더하여 저장한 값을 실수형으로 출력
}























// FLD를 하면, 지정된 데이터가 ST0에 저장되면서 empty -> vaild로 변경.



PUSH EBP MOV EBP,ESP // 함수 프롤로그 SUB ESP,8 // 변수 저장을 위해 스택에 공간 확보 FLD QWORD PTR DS:[4020F8] // 004020F8에 있는 정보 8byte를 ST0에 로드 (ST0는 empty-> valid) FSTP QWORD PTR SS:[EBP-8] // [EBP-8]에 원래 있던 데이터는 스택에서 pop하고, ST0에 있는 데이터를 EBP-8스택에 저장, 그러면 ST0는 다시 valid -> empty

SUB ESP,8 // 변수 저장을 위해 스택에 공간 확보 FLD QWORD PTR SS:[EBP-8] ; | // [EBP-8]에 있는 8byte의 데이터를 ST0에 로드 (ST는 empty -> valid) FSTP QWORD PTR SS:[ESP] ; | // ESP에 있던 기존의 내용은 스택에서 POP하고, ST0에 들어있는 8Byte에 내용을 ESP에 저장(ST0은 valid ->empty) PUSH c_pro.004020F4 ; |format = "%f" CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf ADD ESP,0C // 함수의 에필로그 XOR EAX,EAX // 리턴값 반환하는 EAX를 초기화 MOV ESP,EBP POP EBP RETN




* FLD

// 데이터를 로드



* FSTP

// 데이터를 저장 (저장시 기존내용을 POP한다)




004.



#include <stdio.h>
void main()
{
int x;
int y;
x = 10;
y = x - 5;
if( x > y )
{
printf( "x의 값이 y보다 큽니다." );
}
else
{
printf( "x의 값이 y보다 작거나 같습니다." );
}
}





PUSH EBP
MOV EBP,ESP // 함수의 프롤로그
SUB ESP,8 // 변수 선언을 위해 스택 공간 확보
MOV DWORD PTR SS:[EBP-8],0A // 10을 [EBP-8]에 저장
MOV EAX,DWORD PTR SS:[EBP-8] // [EBP-8]에 있는 10을 EAX에 저장
SUB EAX,5 // EAX=EAX-5
MOV DWORD PTR SS:[EBP-4],EAX // EAX에 있는 5를 [EBP-4]에 저장
MOV ECX,DWORD PTR SS:[EBP-8] // [EBP-8]에 있는 10을 ECX에 저장
CMP ECX,DWORD PTR SS:[EBP-4] // ECX에 있는10에서 [EBP-4]에 있는 5를 뺀다. ECX가 더 크므로 점프하지 않는다.
JLE SHORT c_pro.0040102E // 작거나 같으면 점프니깐 점프를 하지 않는다.
PUSH c_pro.004020F4 ; /format = "x의 값이 y보다 큽니다."
CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf
ADD ESP,4 // 스택에 공간확보
JMP SHORT c_pro.0040103C // 무조건 0040103C로 점프하기
PUSH c_pro.0040210C ; /format = "x의 값이 y보다 작거나 같습니다."
CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf
ADD ESP,4
XOR EAX,EAX // 함수 에필로그
MOV ESP,EBP
POP EBP
RETN



* CMP A, B
// A에서 B를 뺀다.
















* JLE A, B (Jump Less Equals)
// A<=B => 점프 (무조건 A기준이다.)



005.





#include <stdio.h>
void main()
{
int x;
int y;
x = 20;
y = 10;
if( x > y )
{
printf( "x의 값이 y보다 큽니다." );
}
else
{
printf( "x의 값이 y보다 작거나 같습니다.");
}
}





























PUSH EBP
MOV EBP,ESP // 함수의 프롤로그
SUB ESP,8 // 변수 선언을 위해 스택에 공간확보
MOV DWORD PTR SS:[EBP-8],14 // [EBP-8]에 14 넣기
MOV DWORD PTR SS:[EBP-4],0A // [EBP-4]에 0A넣기
MOV EAX,DWORD PTR SS:[EBP-8] // [EBP-8]에 있는 14를 EAX에 넣기
CMP EAX,DWORD PTR SS:[EBP-4] // EAX에 있는 14와 [EBP-4]에 있는 0A를 비교하기
JLE SHORT c_pro.0040102C // 작거나 같으면 점프하기. 하지만, 크기때문에 점프하지 않는다.
PUSH c_pro.004020F4 ; /format = "x의 값이 y보다 큽니다."
CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf
ADD ESP,4 // 사용한 함수있는 스택공간 지우기
JMP SHORT c_pro.0040103A // 무조건 점프
PUSH c_pro.0040210C ; /format = "x의 값이 y보다 작거나 같습니다."
CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf
ADD ESP,4 // 사용한 함수가 있는 스택공간 지우기
XOR EAX,EAX // EAX(리턴값)을 초기화
MOV ESP,EBP // 함수의 에필로그
POP EBP
RETN






'리버싱 > C언어 300제' 카테고리의 다른 글

리버싱 - c언어(006-010)  (0) 2018.12.24

+ Recent posts