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 |
---|
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언어(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.141592int 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 EBPMOV 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-5MOV 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>] ; \printfADD ESP,4 // 스택에 공간확보JMP SHORT c_pro.0040103C // 무조건 0040103C로 점프하기PUSH c_pro.0040210C ; /format = "x의 값이 y보다 작거나 같습니다."CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printfADD ESP,4XOR EAX,EAX // 함수 에필로그MOV ESP,EBPPOP EBPRETN* 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 EBPMOV 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>] ; \printfADD ESP,4 // 사용한 함수있는 스택공간 지우기JMP SHORT c_pro.0040103A // 무조건 점프PUSH c_pro.0040210C ; /format = "x의 값이 y보다 작거나 같습니다."CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printfADD ESP,4 // 사용한 함수가 있는 스택공간 지우기XOR EAX,EAX // EAX(리턴값)을 초기화MOV ESP,EBP // 함수의 에필로그POP EBPRETN
리버싱 - c언어(006-010) (0) | 2018.12.24 |
---|