programing 2014. 10. 2. 13:24

10-2 C++

생성자 함수


class 함수및 객체, 멤버 변수 함수 생성

생성자는 반드시 있어야하며, 생성자가 없을경우 기본생성자로 컴파일러에 의해 자동생성

같은이름의 생성자를 중복생성 가능하다.단, 생성자간의 매개변수의 차이같은 약간의 차이점이 있어야한다.

생성자는 함수와는 다르게 리턴값이 존재하지 않는다.

*생성자 : 함수의 내용과 마찬가지로, 생성자 함수 내의 내용을 만들어 주는것, 선언되지 않으면 빈 공간으로 만들어진다.

생성자가 하나라도 선언이 되어있으면 생성자를 자동으로 생성하지 않는다. 


소멸자 함수

객체가 소멸되는시점에서 자동으로 한번만 호출되는 함수

객체가 사라질때의 마무리 작업을 위함 - 실행중 동적할당된 메모리 해제, 파일 저장 및 닫기, 네트워크 닫기

소멸자 함수의 이름은 클래스 이름 앞에 ~을 붙인다.

소멸자는 리턴타입이 없고, 어떤값도 리턴하면 안됨

소멸자가 없으면 기본소멸자가 자동생성

기본소멸자 : 단순 리턴

소멸자는 객체 생성의 반대순으로 소멸된다. 소멸자가 호출되는 시점은 함수가 종료되어 객체가 소멸하는 시점이다. 여러 객체를 호출했으면 그 객체들이 모두 소멸될때까지 계속 호출된다.


객체 소멸, 생성순서

전역객체는 프로그램에 선언된 순서로 생성

지역객체는 함수가 호출되는 순간에 순서대로 생성

함수가 소멸하면 지역객체가 생성된 순서의 역순으로 소멸

-> 전체적으로는 생성된 순서의 역순으로 소멸하고, 함수내에서 호출될경우 해당 함수가 종료할때 호출된 순서의 역순으로 소멸한다.



'programing' 카테고리의 다른 글

09/18 c++ 강의  (0) 2014.09.18
c++ 강의 9/11  (0) 2014.09.11
파일 위치 지시자  (0) 2014.06.07
calloc realloc 조사  (0) 2014.06.06
ftell, fseek 함수  (0) 2014.05.31
Cryptography 2014. 9. 27. 04:53

암호학 2주차 스터디

관용암호, 스트림 암호, 블록 암호화 방식에 대한 각각의 정리, 소개


관용 암호 


-대칭키 암호 방식, 공통키 암호화 방식, 비밀키 암호화 방식이라고도 한다.

-암호화와 복호화에 동일한 키를 사용하는 관용적으로 사용되는 암호화 방식을 통틀어 말한다.

-평문을 전자와 환자를 조합하여 암호화 하는 방식이다.

-알고리즘의 동작 속도가 빠르고, 키의 길이가 공개키 암호 시스템에 비해 짧다

-크게 블록암호와 스트림 암호 두종류로 구분된다

-송신자가 평문을 암호키로 암호화한 암호문을 수신자에게 보내면,

 수신자는 수신한 암호문을 복호키를 사용해서 복호화하여 평문을 얻는다.

-암호화키를 알면 복호화 키를 알아낼 수 있어 수신자에게 키를 알려주기 힘들다는 단점이 있다. 

-> 이는 암호화키와 복호화 키가 같거나, 알고리즘의 역연산을 통해 거꾸로 계산하여 쉽게 복호화 키를 알아낼 수 있기 때문 => 전주 아핀암호를 통해 봤었음.


블록 암호


-어느 특정 비트수의 집합을 한번에 처리하는 암호 알고리즘 방식

-평문을 일정 크기의 블록으로 잘라낸 후 암호화 알고리즘을 적용한다

-DES,AES 방식


스트림 암호

-평문과 같은 길이의 문자 데이터의 흐름을 순차적으로 처리해가는 암호 알고리즘 방식

-평문과 키 스트림을 XOR 하여 암호를 생성한다.

-rc4,LFSR방식

 

 

 

 

'Cryptography' 카테고리의 다른 글

암호학 스터디 1주차  (0) 2014.09.24
암호학 자료  (0) 2014.09.24
Cryptography 2014. 9. 24. 15:58

암호학 스터디 1주차




'Cryptography' 카테고리의 다른 글

암호학 2주차 스터디  (0) 2014.09.27
암호학 자료  (0) 2014.09.24
Cryptography 2014. 9. 24. 15:43

암호학 자료

http://infosec.kut.ac.kr/sangjin/class/cryptoprog0701/note01.pdf


http://infosec.kut.ac.kr/sangjin/class/cryptoalgo2010-01/chap04.pdf


http://marcof.tistory.com/58


http://system.kcu.ac/opendept/crypto/sub/sub04.htm


http://math88.com.ne.kr/crypto/DES/2des.html

'Cryptography' 카테고리의 다른 글

암호학 2주차 스터디  (0) 2014.09.27
암호학 스터디 1주차  (0) 2014.09.24
programing 2014. 9. 18. 13:41

09/18 c++ 강의

string 클래스 

c++ 표준 클래스

문자열의 크기에 따른 제약 없음

-string 클래스가 스스로 문자열 크기에 맞게 내부 버퍼를 조절한다.

문자열 복사, 비교, 수정들을 위한 다양한 함수와 연산자 제공

객체 지향적

<string> 헤더 파일에 선언

C-스트링 타입보다 다루기 쉽다.



string 변수명 ("문자열") 형태로 사용이 가능하다.

기존 c언어에서 문자열을 출력함과 동시에 선언까지 한꺼번에 해준다고 생각하면 편하다.

일일히 문자열의 버퍼 크기를 지정해줄 필요는 없지만, 배열형태로 사용이 가능하기에 그냥 이름만 붙여서 선언하면 []형태의 배열로 사용이 가능하다. 또한  

cout << "문자열" + hello + "문자열 2" ;

와 같은 형태로 hello 라는 변수명을 가진 문자열을  + 형태로 이어서 출력해주는것이 가능하다.


string 방식과 c-string 방식 두가지 방식으로 사용하는 것이 가능한데

"cin.getline(name,10,'\n');"

c- string 방식은 위와 같이 사용한다.

"getline(cin,변수명);"

string 방식은 위와 같이 사용하는데, 이떄 string 파일을 include 해주어야 한다.

객체와 클래스


객체는 상태와 행동으로 구성된다. (state , behavior)

상태에 대한 내용은 멤버 번수로 표현된다. 

행동에 대한 내용은 멤버 함수로 표현되는데, 연산 또는 기능이라고도 한다.


클래스 

-객체를 만들어내기 위해 정의된 설계도 또는 틀

-클래스는 객체가 아님. 실체도 아님.

-멤버 변수와 멤버 함수 선언.


객체

-객체는 생성될 떄 클래스의 모양을 그대로 가지고 탄생한다.

-멤버 변수와 멤버 함수로 구성된다.

-메모리에 생성되며 실체(instance)라고도 부른다.

-하나의 클래스 틀에서 찍어낸 여러 개의 객체 생성이 가능하다.

-객체들은 상호 별도의 공간에 생성된다.


같은 클래스에서 만들어졌더라도 다른 객체가 나올 수 있다. - 상세적인 값이 달라질 수 있다. (구조체의 성격)


클래스는 멤버 변수와 멤버 함수로 구성. 클래스 선언부와 구현부로 구성된다.


클래스 선언부

-class 키워드를 이용하여 클래스 선언

-멤버 변수와 멤버 함수 선언 :

멤버 함수는 원형 형태로 선언되며 클래스 선언 내에서 초기화할 수 없다.

-멤버에 대한 접근 권한 지정 :

private,public,protected중의 하나이며 기본값은 private이다. public은 다른 모든 클래스와 객체에서 멤버의 접근이 가능하다는것을 표시한다.



클래스 선언부 예

"class circle {
public : int radius; // 멤버 변수
double getArea(); //멤버 함수
};
"

클래스 구현부 예

"double circle::getArea(){
return 3.14*radius*radius
};
"


'programing' 카테고리의 다른 글

10-2 C++  (0) 2014.10.02
c++ 강의 9/11  (0) 2014.09.11
파일 위치 지시자  (0) 2014.06.07
calloc realloc 조사  (0) 2014.06.06
ftell, fseek 함수  (0) 2014.05.31
programing 2014. 9. 11. 14:52

c++ 강의 9/11

iostream - Input Output stream :

c언어의 stdio 에 대응


cout,cin - C-output, C-input :

 outpu과 input, 즉 출력과 입력을 의미하며 << (쉬프트 연산자)와 함께 사용된다. 


쉬프트 연산자 - << :

 해당 쉬프트 연산이 가리키는 방향으로 값을 넣어준다고 이해하자.

예를들어 A << B 라면 A에 B의 값을 인자로 넘겨 A를 호출한다고 생각할 수 있다.


std:cout << " A + 3 = " <<  a+3 << std::endl;


 또한 기존 c언어 문법에서 사용하던 %d나%c 같은 서식문자를 사용하여 변수를 호출하는 대신, << 쉬프트 연산자를이용하여 변수나 함수, 연산식을 바로바로 호출할 수 있다.


std- Standard

 '일반적이다' 라고 이해하면 될것같고, std::cout 와 같은 형태로 사용된다, 죽 이어서 읽어본다면 Standard C output 이 되며 출함수로 c언어의 printf 에 대응된다.


C언어와 마찬가지로 std::cout (printf) 에서 함수의 리턴값을 호출하거나 연산식의 호출 또한 가능하다.


std:cout << "n+5 =" << n+5;

 

Namespace-이름공간:

이름충돌이 발생하는 경우 - 여러명이 서로 나누어 프로젝트를개발하거나, 오픈소스&다른사람이 작성한 코드나 목적파일을 가져와 컴파일 하거나 링크하는 경우에 주로 발생한다.using naemespace std; 라는 코드를 통해 이후의 namespace에 일일히 std를 입력하지 않아도 이름공간에 std가 저절로 들어가게 해줄 수 있다. 또한 namespace는 변수명이나 구조체, 함수처럼 선언하여 사용하는것이 가능하다.


namespace hello {

int a=3;

 int b=4;

} // hi::a, hi::b 와 같은 형태로 이름공간 내의 변수 선언, 호출이 가능하다.

using namespace std; // std 이름공간을 사용하겟다고 선언

int main(){


cout << "a값 : " << hello::a <<"b 값 : "<< hello ::b << '\n';


}


변수의 선언 : 

절차지향적인 c언어에서는 변수의 선언이 함수나 프로그램의 상단에서 이루어져야 했다면, 객체지향적인 C++언어에서는 변수의 선언이 함수나 프로그램의 상단에서 할 필요 없이 프로그램이 진행되는곳 어디에서나 가능하다.


연습문제1:

#include <iostream>

using namespace std;

namespace network{

int count;


void Test()

{

 cout << "\n 통신을 테스트 합니다."<<endl ;

};

}


namespace Data{

int count;


void Test()

{

 cout << "\n 데이터 처리 작업을 수행합니다. "<<endl ;

};

}



int main()

{

cout << "통신 횟수 입력 : " ;

cin >> network::count;

cout << "\n데이터 처리 횟수 입력 : ";

cin >> Data::count;

int count;


for(count=0;count!=network::count;count++)

network::Test();


for(count=0;count!=Data::count;count++)

Data::Test();

cout << "\n";

return 0;

}


연습문제 2:

#include <iostream>

using namespace std;


namespace Vals{

namespace Valin{

int n1;

};

int n2;

};



namespace Sum{

int CalFunc(int n1,int n2)

{

return n1+n2;

};


};


namespace Minus{

int CalFunc(int n1,int n2)

{

return n1-n2;

};


};



int main()

{

cout << "값1 : ";

cin >> Vals::n2;

cout << "값2 : ";

cin >> Vals::Valin::n1;


Sum::CalFunc(Vals::n2,Vals::Valin::n1);

cout<<"Minus = " << Minus::CalFunc(Vals::n2, Vals::Valin::n1) << endl;


}


c언어와는 약간 다른 생소한 방식의 c++ 언어이지만, 기본적으로는 c언어의 문법을 그대로 가져다 쓰는것이 많고, c언어에서 파생되어 나왔기 때문인지 c언어와 많은 부분이 닮아있었다. 기존 c언어의 지식을 얼마나 잘 활용하느냐가 c++언어를 익히는데에 중요하게 작용할 것 같다.


'programing' 카테고리의 다른 글

10-2 C++  (0) 2014.10.02
09/18 c++ 강의  (0) 2014.09.18
파일 위치 지시자  (0) 2014.06.07
calloc realloc 조사  (0) 2014.06.06
ftell, fseek 함수  (0) 2014.05.31
SYSTEM 2014. 8. 16. 08:31

iat에 대한 좋은 자료

http://yokang90.tistory.com/26

'SYSTEM' 카테고리의 다른 글

(FSB)두가지 방법의 FSB  (0) 2014.07.27
FSB(포맷 스트링 버그)  (0) 2014.07.27
SYSTEM 2014. 7. 27. 18:44

(FSB)두가지 방법의 FSB

FSB기법에는 여러가지 방법이 있는데, .dtor의 주소를 사용해서 함수의 RET를 바꿔주는 방법과 GOT주소를 이용하는 방법을 알아볼것이다.

일단 .dtors를 이용한 fsb에 대해 먼저 보자.

.dtors

GNU 컴파일러는 컴파일시에 .ctors, .dtors 두 세그먼트를 생성하는데, 

.ctors속성의 함수는 main() 전에 실행되고, .dtors 속성의 함수는 main() 종료 후에 실행된다

그러므로 main 함수가 종료된 다음 .dtors 속성의 함수가 실행되는 것을 이용해 .dtors 속성의 함수 내용을 얻어내면 해당 영역에서 호출되는 함수들의 주소값을 알아낼 수 있는것이다.

즉, .dtors성격을 가진 함수의 ret값을 가져와서 해당 ret 주소에 쉘코드가 담긴 환경변수의 주소값을 넣어주는 것이다.

이 방법은 해당 함수가 종료된 후에 쉘이 실행되도록 하는 방법이다.


그다음은 GOT주소를 이용한 fsb를 볼것인데, 일단 GOT주소가 무엇인고

PLT(Procedure Linkage Table)

PLT는 일종의 실제 호출 코드를 담고 있는 테이블로써 이 내용 참조를 통해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 된다

GOT(Global Offset Table)

GOT는 PLT가 참조하는 테이블로써 프로시져들의 주소를 가지고 있는데, PLT가 어떤 외부 프로시져를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 된다.

함수를 맨 처음 호출할때는 PLT로 이동해서 GOT를 참조, 다시 PLT로 이동해서 dl_runtime_resolve 를 수행해 GOT를 저장한후 실제 함수 주소로 점프하는데, 같은 함수를 다시 호출할 때는 이미 GOT에 실제 함수의 주소가 저장되어 있으므로 함수를 호출한 다음 PLT에서 바로 GOT를 참조하여 함수로 점프할 수 있게 된다.

즉, got주소를 이용한 fsb는 함수의 ret주소를 변조하는것이 아닌, 함수가 실행될 주소를 변조하는 방법이라고 할 수 있다.

이방법을 사용하기 위해서는 일단 프로그램 내에서 같은 함수가 두번 이상 호출되어야 한다. 그래야만 GOT에 실제 함수의 주소가 들어있어 PLT에서 GOT를 바로 참조할 수 있기 때문. 두번이상 호출되지 않은 함수를 사용한다면 함수로의 점프가 곧바로 이루어 지지 않아 원하는 결과를 얻을 수 없을것이다.

fsb를 할떄는 이 두번이상 호출된 함수의 GOT주소값을 불러와 해당 주소에 쉘코드가 담긴 환경변수의 주소값을 넣어준다.

이 방법은 해당 함수가 실행될때에 이동하는 주소를 바꿔서 함수대신 쉘코드가 실행되게 하는 방법이다. 해당 함수가 시작할때에 쉘이 실행된다.

'SYSTEM' 카테고리의 다른 글

iat에 대한 좋은 자료  (0) 2014.08.16
FSB(포맷 스트링 버그)  (0) 2014.07.27
SYSTEM 2014. 7. 27. 18:33

FSB(포맷 스트링 버그)

Format String Bug - 포맷 스트링 버그

printf() 함수를 사용할때, 함수에 원형에 따른 사용 방법은 ("변수이름",서식문자) 이지만 사실 변수 이름만 사용해도 별 문제는 없다. 그러나 변수의 내용안에 서식문자가 들어가게 되면 문제가 발생한다. printf함수가 실행되는 와중에 서식문자를 만나고, 만난 서식문자를 문자열로 보지 않고 서식 문자로 인식해버려 현재 메모리 스택의 다음 4바이트를 참조해 서식문자에 맞는 값을 출력해버린다. 이때의 변수는 printf함수의 인자값 형태로 들어갈텐데, esp가 계속 올라가면서 메모리를 참조하다보면 printf()함수의 ret 위치까지 참조를 해버린다. 이때 발생하는게 포멧 스트링 버그다.

단순히 참조만 한다면 에러가 나지 않겠지만, %n서식문자를 사용하면 에러가 발생한다. %n서식문자는 %n이 나오기전 출력된 자릿수를 계산하여 다음 참조될 메모리 4바이트를 주소값으로 인식, 해당 주소 위치에 4바이트 만큼의 숫자를 입력해버린다. 이때문에 원래 정상적인 값이 들어가야만 하는 위치에 전혀 다른값이 들어가게 할 수 있다.

또한, 문자열의 길이를 계산하는 %n 서식문자의 특성상 %c서식문자를 통해 특정 길이의 문자를 출력하여 원하는만큼의 숫자를 %n서식문자가 출력하게 만들 수 있다. (%’숫자’c 형태로 사용)

%hn 이라는 서식문자는 %n과 같은 기능을 하지만, 4바이트 값이 아닌 2바이트 값을 입력하는 기능을 한다.


'SYSTEM' 카테고리의 다른 글

iat에 대한 좋은 자료  (0) 2014.08.16
(FSB)두가지 방법의 FSB  (0) 2014.07.27
Reversing 2014. 7. 25. 05:49

peview 만들기

C언어를 이용해 PE viewer를 구현해보았다.

fseek 함수를 이용해 파일 위치지정자를 조정해  파일의 특정 위치를 읽어오는 방법으로 점점 아랫쪽주소로 내려갔다.

줄맞추기 노가다에 시간을 더 쏟은것 같기도 하다..

제일 어려웠던 부분은 파일 입출력 부분.


#include #include int main() { FILE *fp; char str[100]={0,}; char name[100][100]={0,}; int num[100]; char fn[1000]; int t,d; printf("type file name : "); scanf("%s", fn); fp=fopen(fn,"rt"); //파일경로에 공백 x if(fp==NULL){ printf("error!\n"); } //fprintf(fp,"Hello world\n"); fseek(fp,0,SEEK_SET); fread(str,2,1,fp); printf("\tName\t\t\tData\t value \n"); printf("Dod_Header_Signature : "); printf(" \t%x%x\t %s\n",*(str+1),*str,str); printf("\n"); fseek(fp,60,SEEK_SET); fread(num,4,1,fp); printf("\te_flanew :"); printf("\t\t%.8x \n", *num); printf("\n"); t=*num; fseek(fp,t,SEEK_SET); fread(num,4,1,fp); printf("NT_Header_Signature :"); printf("\t\t%.8x \n", *num); printf("\n"); fseek(fp,t+4,SEEK_SET); fread(num,2,1,fp); printf("\tmachine\t :"); printf("\t\t%.8x \n", *num); printf("\n"); fread(num,2,1,fp); printf("Number of Sections :"); printf("\t\t%.8x \n", *num); printf("\n"); fseek(fp,t+20,SEEK_SET); fread(num,2,1,fp); printf("Size Of Optional Header:"); printf("\t%.8x \n", *num); printf("\n"); fread(num,2,1,fp); printf("Characteristics\t :\t"); printf("\t%.8x \n", *num); printf("\n"); t=t+40; fread(num,2,1,fp); printf("Magic \t\t\t:"); printf("\t%.8x \n", *num); printf("\n"); fseek(fp,t,SEEK_SET); fread(num,4,1,fp); printf("Address of Entry Point :"); printf("\t%.8x \n", *num); printf("\n"); fseek(fp,t+12,SEEK_SET); fread(num,4,1,fp); printf("Image Base\t\t :"); printf("\t%.8x \n", *num); printf("\n"); fread(num,4,1,fp); printf("Section Alignment\t :"); printf("\t%.8x \n", *num); printf("\n"); fread(num,4,1,fp); printf("File Alignment\t\t :"); printf("\t%.8x \n", *num); printf("\n"); t=t+40; fseek(fp,t,SEEK_SET); fread(num,4,1,fp); //130 printf("Size of Image\t\t :"); printf("\t%.8x \n", *num); printf("\n"); fread(num,4,1,fp); printf("Size of Headers\t\t :"); printf("\t%.8x \n", *num); printf("\n"); fseek(fp,t+12,SEEK_SET); fread(num,2,1,fp); printf("Sybsystem\t\t :"); printf("\t%.8x \n", *num); printf("\n"); t=t+36; //154 fseek(fp,t,SEEK_SET); fread(num,4,1,fp); printf("Number of Data Directories :"); printf("\t%.8x \n", *num); printf("\n"); t=0; strcpy(name[t],"EXPORT Table\t\t"),t++; strcpy(name[t],"IMPORT Table\t\t"),t++; strcpy(name[t],"RESOURCE Table\t\t"),t++; strcpy(name[t],"EXCEPTION Table\t\t"),t++; strcpy(name[t],"CERTIFICATE Table\t"),t++; strcpy(name[t],"BASE RELOCATION Table\t"),t++; strcpy(name[t],"DEBUG Directory\t\t"),t++; strcpy(name[t],"Architecture Specific Data"),t++; strcpy(name[t],"GLOBAL POINTER Register"),t++; strcpy(name[t],"TLS Table\t\t"),t++; strcpy(name[t],"LOAD CONFIGURATION Table"),t++; strcpy(name[t],"BOUND IMPORT Table \t"),t++; strcpy(name[t],"IMPORT Address Table\t"),t++; strcpy(name[t],"DELAY IMPORT Descriptors"),t++; strcpy(name[t],"CLI Header\t\t"),t++; strcpy(name[t],"\t\t\t"),t++; for(d=(*num),t=0;d!=0;d--,t++) { printf("\n"); fread(num,4,1,fp); printf("%s :",name[t]); printf("\t%.8x \n", *num); fread(num,4,1,fp); printf("\t\t\t\t%.8x \n", *num); } // fclose(fp); return 0; }


'Reversing' 카테고리의 다른 글

리버스 엔지니어링 07-14  (0) 2014.07.14