$bash

'0x0300 : Study'에 해당되는 글 72건

  1. SQL - 기초
  2. SQL - SQL?
  3. C - 배열과 포인터
  4. C - 포인터
  5. C - 배열
  6. C - 함수
  7. System - Assembly Handray
  8. System - stack? gdb?
  9. System - 시스템해킹이란?
  10. Egg Shell

SQL - 기초

0x0300 : Study/0x0305 : SQL

SQL 기초

SELECT

관계 연산자의 사용
// SELECT 아이디, 이름 
// FROM userTbl 
// WHERE 생년 >= 1970 AND 신장 >= 182

BETWEEN... AND와 IN()
// SELECT 이름, 신장 
// FROM UserTbl 
// WHERE 신장 BETWEEN 180 AND 183

// SELECT 이름, 지역
// FROM UserTbl
// WHERE 지역 IN (N'서울', N'경기', N'강원'

ANY / ALL / SOME 그리고 하위쿼리(SubQuery)
// SELECT 이름, 신장
// FROM UserTbl
// WHERE 신장 >= ANY (SELECT 신장 FROM UserTb WHERE 지역 = N'서울')

// SELECT 이름, 신장
// FROM UserTbl
// WHERE 신장 = ANY (SELECT 신장 FROM UserTbl WHERE 지역 = N'서울')

ORDER BY (순서대로 정렬)
// SELECT 이름, 신장
// FROM userTbl
// ORDER BY 신장

DISTINCT (중복 제거)
// SELECT DISTINCT addr
// FROM userTbl

TOP(N) (상위 N개만 출력)
// SELECT TOP(10) 신장
// FROM UserTbl

// SELECT TOP(0.1) PERCENT 신장
// FROM UserTbl

GROUP BY (집계함수 활용)
// SELECT 아이디 AS [사용자 아이디], SUM(수량) AS [총 구매 개수]
// FROM buyTbl
// GROUP BY userid

// SELECT AVG(수량) AS [평균 구매 개수]
// FROM buyTbl

// SELECT 아이디, AVG(수량 * 1.0) AS [평균 구매 개수]
// FROM buyTbl
// GROUP BY 아이디


SQL Insert, Update, Delete

Insert 구문 형식
// INSERT INTO 테이블이름 (열이름1, 열이름2, .... )
// VALUES(값1, 값2, 값3, .... )

Update 구문형식
// UPDATE 테이블이름
// SET 열1=값1 , 열2=값2 ...
// WHERE 조건

Delete 구문형식
// DELETE 테이블이름
// WHERE 조건

SQL 고급

JOIN

구매 테이블 중에서 'LCS' 아이디를 가진 사람이 구매한 물건을 발송하기 위해서, 이름 / 주소 / 연락처 등을 조인
// SELECT *
// FROM buyTbl INNER JOIN UserTbl
//     ON buyTbl . 아이디 = UserTbl . 아이디
// WHERE buyTbl. 아이디 = 'LCS' ;

별칭의 사용.
테이블의 별칭을 사용함으로써 코드를 간결화 할 수 있다.
// SELECT *
// FROM BuyTbl B INNER JOIN userTbl  U
//     ON B . 아이디 = U . 아이디
// WHERE B . 아이디 = 'LCS' ;

CASE

구매한 액수에 따라서 최우수고객 / 우수고객 / 일반 고객 등으로 분류하기 위해서는 CASE구문을 활용한다.

// SELECT U.아이디, U.이름, SUM(단가 * 수량) AS [총구매액]


// CASE

//     when (sum(단가*수량) >= 1500) then N'최우수고객'

// when (sum(단가*수량) >= 1000) then N'우수고객'

// when (sum(단가*수량) >= 1) then N'일반고객'

// else N'유령고객'

// end as [고객등급]


// from buyTbl B right join userTbl U

// on B.아이디 = U.이름


// group by U.아이디, U.이름

// order by sum(단가*수량) desc


TRY ... CATCH

오류를 처리하는 데 편리함.

// use db2016a11

// begin try

//  insert into usertbl_ÃÖ°­Çö values('LSG', N'이상구', 1988, N'서울', '999', '9999', 170)

//  print N'정상적으로 입력이 됬습니다.'

// end try


// begin catch

//  print N'응 안되 돌아가 ^ㅡ^'

// end catch



'0x0300 : Study > 0x0305 : SQL' 카테고리의 다른 글

SQL - 트랜잭션 작동 및 복구  (1) 2016.06.15
SQL - SQL?  (0) 2016.06.15

SQL - SQL?

0x0300 : Study/0x0305 : SQL

데이터 형식

문자데이터

// char, nchar, varchar, nvarchar [n 은 유니코드허용. var는 주소같은 값?..]


숫자 데이터

// int(정수) , real(실수) , bit (0 또는 1)


날짜/시각 데이터

// datetime 밀리초까지 나타낸다.

// smalldatetime 분 까지 나타낸다.


기본키

데이터의 무결성을 지키기 위한 제한된 조건

// 특정 데이터를 입력할 때 무조건 입력되는 것이 아니라, 어떠한 조건을 만족했을 때에만 입력되도록 제한하는 것


테이블의 각 행들은 구분할 수 있는 식별자


중복될 수 없고, NULL값이 입력될 수 없음


기본 키로 설정하면 자동으로 클러스터형 인덱스가 생성됨.


// CREATE TABLE userTbl

// ( userID nchar(8) NOT NULL PRIMARY KEY, name nvarchar(10) NOT NULL)


// CREATE TABLE userTbl

// ( userID nchar(8) NOT NULL CONSTRAINT PK_userID PRIMARY KEY, name nvarchar(10) NOT NULL)


Unique

중복되지 않는 유일한 값을 입력해야 함.


primary key 제약조건과 거의 비슷하며 차이점은 Null값을 허용한는 것(대개 후보키에 설정)


// CREATE TABLE userTbl

// ( userID nchar(8) NOT NULL PRIMARY KEY ... email nchar(30) NULL UNIQUE )


외래 키 (foreign key)

두 테이블 간의 관계를 선언함으로써 데이터의 무결성을 보장해 줌


외래키 관계를 설정하게 되면 하나의 테이블이 다른 테이블에 의존하게 됨


'외래키 테이블'에 데이터를 입력할 때는 꼭 '기준 테이블'을 참조해서 입력하므로, '기준 테이블'에 이미 데이터가 존재해야만 함.


// CREATE TABLE userTbl

// ( userID nchar(8) NOT NULL PRIMMARY KEY, ..... ) GO

// CREATE TABLE buyTbl

// ( num int NOT NULL PRIMARY KEY, userid nchar(8) NOT NULL FOREIGN KEY REFERENCES userTbl(userID) )


데이터 무결성 (Integrity)

개체 무결성

// 기본키가 Null 값을 가질 수 없음

// 이렇게 되면 모든 필드는 키필드에 종속 됨


도메인 무결성

// 필드의 유효한 값만을 허용

// 데이터 타입, Null 허용여부 등이 도메인 무결성을 지켜 줌


참조 무결성

// 외래키가 참조하는 기본키는 반드시 존재해야 함

// 외래키가 참조하고 있는 기본키는 임의로 삭제 불가


Check

입력되는 데이터를 점검하는 기능


Check 제약조건이 설정되면 제약조건에 위배되는  데이터는 입력 안됨


// 출생년도가 1900년 이후이고 현재 시간 이전이어야 하는 조건을 지정


// ALTER TABLE userTbl

// ADD CONSTRAINT CK_birthYear

// CHECK

// (birthYear >= 1900 AND birthYear <= YEAR(GETDATE()))


Default

데이터를 입력하지 않았을 때 자동으로 입력되는 값을 정의하는 방법

//단, 값이 직접 명기되면 DEFAULT로 설정된 값은 무시


// CREATE TABLE userTbl

// userID nchar(8) NOT NULL PRIMARY KEY, name nvarchar(10) NOT NULL, brith Year int NOT NULL DEFAULT YEAR (GETDATE())....



'0x0300 : Study > 0x0305 : SQL' 카테고리의 다른 글

SQL - 트랜잭션 작동 및 복구  (1) 2016.06.15
SQL - 기초  (0) 2016.06.15

C - 배열과 포인터

0x0300 : Study/0x0304 : Programming


배열과 포인터

배열명 - int ary[3];

   - ary == &ary[0];

배열명 + 정수 - int ary[3];

 ary + 1;

배열명과 포인터는 같다. - int ary[3];

 int *pa = ary;

 pa[1] =10;

배열명과 포인터는 다르다. - ary ++; (틀림)

     pa ++ ; (맞음)



배열명의 정체

배열명은 컴파일 과정에서 첫 번째 배열 요소 주소로 변환

// 배열- 자료형이 같은 변수 메모리에 연속 할당


배열명이 주소인지 확인 해주는 코딩이다.

배열명은 따로 지정이 안했기 때문에 첫번째 값과 두번째 주소값이 같게 나오는 것을 확인 할 수 있다.

배열명이 요소와 첫번째 요소의 값 또한 요소가 가리키는 것이 첫번째 배열 이기 때문에 쉽게 찾을 수 있다.


배열명으로 배열 요소 사용

// 주소는 정수처럼 보이지만 자료형에 대한 정보를 갖고 있는 특별한 값이다.

// 정해진 연산만 가능


배열명에 정수 연산을 수행하여 배열 요소를 사용하는 방법 이다.


// ary[1] = *(ary + 1)

// ary[2] = ary + 2


배열명 역활을 하는 포인터

포인터가 배열명 저장하면 배열명처럼 사용 가능.


배열명처럼 사용되는 포인터이다. 


// pa[2] = pa[0] + pa[1]

// *(ary + 2) =  *(ary + 0) + *(ary + 1)

// 둘다 같음을 알 수 있다.


배열명과 포인터의 차이

sizeof 함수 사용 결과의 차이

//배열명에 사용시 배열 전체의 크기를 나타냄

// 포인터에 사용하면 포인터 하나의 크기를 나타냄


변수와 상수의 차이

// 포인터는 그 값을 바꿀 수 있음

// 배열명은 상수이므로 값을 바꿀 수 없음


포인터를 이용한 배열의 입출력 과정이다.


포인터의 뺄샘과 관계 연산

포인터의 뺄셈

// 포인터 - 포인터 > 값의 차 >> 가리키는 자료형의 크기


관계 연산자로 포인터의 대소관계 확인 가능


포인터의 뺄셈과 관계 연산을 코딩을 한 예제이다.


배열의 입출력을 처리하는 함수

주소를 데이터로 주면 해결


호출 - int ary[5] = {10, 20, 30, 40, 50};

 print_ary(ary, 5);


정의 - void print_ary(int *pa, int size)

 {

  printf("%d", pa[i]);

 }


배열의 값을 출력하는 함수

배열의 값 확인하기 위해 수시로 출력해야 한다면?

// 그 기능을 함수로 만들어 호출

// 함수 호출할 때는 배열명을 주고, 함수의 매개변수로 포인터 선언

// 함수 안에서 포인터를 배열명처럼 사용


배열의 값을 함수를 정의해 출력해주는 내용이다.


// print_ary 함수에서는 배열명인 ary를 사용할 수 없다. 따라서 pa값으로 반복문을 처리한 것이다.


배열 요소의 개수가 다른 배열도 출력하는 함수

배열 요소 수가 달라도 원하는 배열 출력 가능한 예제

// 함수 호출 할 때 배열명과 함께 배열 요소 수도 인자로 넘김


크기가 다른 배열을 출력하는 함수이다. 


// 매개변수 size는 배열의 요소 수를 받아 저장하고 그만큼 반복을 한다.

// 출력할 배열 요소수가 바뀌어도 그에 맞춰 모든 배열 요소의 값이 출력이 가능하다는 것이다.


배열에 값을 입력하는 함수

입력 함수는 데이터를 저장할 배열의 위치가 필요하다.

// 배열에 값 입력하는 함수는 함수 안에서 포인터 직접 사용.


배열에 값을 입력하는 함수이다.

'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 포인터  (0) 2016.06.13
C - 배열  (0) 2016.06.13
C - 함수  (0) 2016.06.13

C - 포인터

0x0300 : Study/0x0304 : Programming

포인터

변수의 메모리 주소 저장하는 변수

// 변수?

/ 메모리 상의 저장공간

/ 그 위치를 알면 사용할 수 있음


//위치값 - 주소


포인터와 연산자

주소 연산자 - int a;

     &a;

포인터 - char *pc;

              int *pi;

      double *pd;

간접 참조 연산자 - *pi = 10;


주소연산자

프로그램이 사용하는 메모리에는 바이트 별로 주소값 존재

// 0부터 시작하고 바이트 단위로 1씩 증가

// 2바이트 이상의 크기를 갖는 변수는 여러 개의 주소값에 걸쳐 할당


이러한 코딩으로 변수의 메모리 주소를 확인 할 수 있다.


포인터와 간접참조 연산자

예시로 포인터에 대해 설명해보자.


포인터는 '*' 를 앞에 붙이며 저것은 포인터를 의미하는 표기이다.


int *pa;

int는 주소를 구한 변수의 형태를 의미하며 *는 포인터의 기호, pa 는 포인터의 이름이다.


간접참조 연산자를 사용한 예시로.

대입 연산자 왼쪽 

변수 a사용 // a = 10; 

포인터 pa 사용 // *pa = 10;

대입 연산자 오른쪽

변수 a사용 // b = a;

포인터 pa 사용 // b = *pa;

피연산자

변수 a사용 // a + 20;

포인터 pa 사용 // *pa + 20;

출력

변수 a사용 // printf("&d", a);

포인터 pa 사용 // printf("%d", *pa);

입력

변수 a사용 // scanf("%d", a);

포인터 pa 사용 // scanf("%d", &*pa);

 // scanf("%d", pa);


여러 가지 포인터

// 다양한 포인터의 사용법


포인터를 사용한 두 정수의 합과 평균 계산을 하는 코딩이다.

위처럼 가리키는 변수의 형이 같은 경우 포인터 연속 선언이 가능하다.

포인터의 선언과 동시에 초기화 하는 것 또한 가능한 것을 확인 할 수 있다.


const를 사용한 포인터

// 포인터에 const함수를 사용해보자.


포인터에 const 함수를 사용하여 만든 코딩의 예시이다.


const가 일반 변수 처럼 포인터 값을 고정시킨다면 9행에서 pa는 다른 변수의 주소를 저장 할 수 없다.

pa는 const의 사용과는 무관하게 변수 b 주소 저장, 그 값 간접 참조하여 출력한다.

// 에러 발생 :: l-value 가 const 개체를 지정합니다.


포인터와 주소의 차이

주소는 변수에 할당된 메모리 저장 공간 시작 주소값 자체이다.


포인터는 그 값 저장하는 또 다른 메모리 공간

// 특정 변수의 주소값은 바뀌지 않음

// 포인터는 다른 주소 대입하여 그 값을 바꿀 수 있음


예시로

int a, b;    // 일반 변수 선언

int *p;      // 포인터 선언

p = &a;    // p가 a를 가리키도록 설정

p = &b;    // p가 변수 b를 가리키도록 바꿈


이러한 예시 뿐만 아니라 두 포인터를 한 주소로 저장 할 수 있다.

int a;

int *pa, *pb;

pa = pb = &a;


// 자세한 설명은 생략한다.


주소와 포인터의 크기

모든 주소와 포인터는 같은 크기

// 저장할 주소의 크기에 따라 결정

// 크기가 클수록 더 넓은 범위의 메모리 사용 가능

// 포인터의 크기는 컴파일러에 따라 다를 수 있음


sizeof 연산자를 가지고 주소와 포인터의 크기를 출력하는 코딩이다.

3가지의 변수의 주소 크기는 4로 일정하며, 포인터의 크기 또한 4 로 일정하다.

하지만 각각의 포인터가 가리키는 변수의 크기는 char가 1,  int가 4, double이 8로 나타난다.


포인터의 대입 규칙

크기가 모두 같으므로 대입 연산 쉽게 생각 할 수 있다.

// 포인터는 가리키는 변수의 형태가 같을 때만 대입

// 포인터끼리 대입 연산 수행

/ 여러 개의 포인터로 같은 데이터 다루는 것이 가능

위의 코딩은 허용되지 않은 포인터의 대입이다.


포인터가 필요한 EU

변수 사용하는 가장 쉬운 방법은 이름을 쓰는 것

// 포인터를 사용하려면 추가적인 변수 선언 필요

// 각종 연산 수행해야 하므로 필요한 곳에만 사용


포인터를 사용한 두 변수의 값 교환이다.

swap이라는 이름으로 매개변수로 포인터를 선언하여 두 변수의 값을 바꿨다.


포인터 없이 두 변수의 값 바꾸기

swap 함수에서 main함수의 a,b를 이름으로 직접 사용하는 방법


이 과정에서 a, b를 이름으로 직접 사용하는 방법을 사용했기 때문에 선언되지 않는 식별자로 에러가 뜬다.


// 그래도 기본적인 배열에서 교환하는 것 이랑 비슷비슷해서 .. 자세한건 생략!


'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 배열  (0) 2016.06.13
C - 함수  (0) 2016.06.13

C - 배열

0x0300 : Study/0x0304 : Programming

배열?

각 저장 곤간을 이름과 index로 구분.

메모리에 저장 공간 한꺼번에 확보.

사용할 때는 하나씩 떼어 쓰는 방식으로 구현


선언과 초기화 그리고 요소의 사용


선언 - int ary[5];

초기화 - int ary[5] = {1, 2, 3, 4, 5};

요소 사용  - ary[0], ary[1], ary[2], ary[3], ary[4]..


배열의 기본적인 예시이다.


int a, b, c, d, e; 를 예시로 들어보자.

여기서는 a , b , c .. 각각의 변수에 4바이트씩 공간이 주어져 있다.


int ary[5]; 는

메모리에 공간이 연속적으로 20바이트가 할당되어 있다.


배열의 초기화

최초 할당된 저장 공간에는 쓰레기값 존재.

// 배열이 선언과 동시에 원하는 값 갖도록 하려면 초기화.


배열은 중괄호로 묶어서 초기화

// 반드시 선언과 동시에 초기화

// 선언하고 난 후에 값 저장하려면 배열 요소에 하나 씩 값 대입



배열과 반복문

배열은 같은 형태의 변수가 많이 필요할 때 쉽게 저장 공간 할당, 초기화 가능한 장점 가짐


모든 배열 요소를 일일이 하나씩 사용하는 것은 번거로움


성적 처리 프로그램을 예시로 반복문과 배열을 조합한 코딩을 할 수 있다.


위에서 보면 알 수 있는데

for (int i = 0; i < 5; i++)

{

printf("%5d\n", score[i]);

}

에서 for에서의 i는 score의 i 를 배열의 첨자로 활용 가능하다.


Sizeof 연산자를 활용한 배열 처리

배열은 보통 많은 양의 데이터 처리

// 반복문 사용 필수


배열 요소 수가 바뀌는 경우?

// 배열 처리 반복문을 모두 수정해야 하는 부담

// 배열 요소 수를 직접 계산 하여 반복문에 사용하면 편리


배열 요소 수 = sizeof (배열명) / sizeof (배열 요소)


sizeof 연산자를 사용한 배열의 예시이다.


cnt = sizeof(score) / sizeof(score[0]);

cnt는 배열 요소 수 (5) 가 되고 score은 배열 전체 크기인 20바이트 이며 배열 요소 하나의 크기는 score[0]이 4바이트로 주어진다.


char 형 배열선언과 초기화

문자열은 문자의 연속

// 문자열 저장할 때는 char형 배열 사용


가장 기본적인 예시이다.


문자열 끝에 널 문자가 없는 경우가 있다

이러한 경우는 쓰레기 값을 문자열로 출력 하기도 한다...


이처럼 뒤에 빈공간이 있다면 글자가 이상한 쓰레기 값이 출력 되는 것을 확인 할 수 있다.

// 물론 테스트는 하지 않았습니다 ^ㅡ^...


문자열 대입

char형 배열은 문자열 저장하는 변수의 역할을 한다.

// 초기화 된 이후에도 새로운 문자열 저장이 가능

// 문자열의 길이가 다를 수 있음


strcpy함수를 활용한 문자열 대입하는 배열 예제이다.


문자열 입출력 함수로 gets, puts가 있다.



'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 포인터  (0) 2016.06.13
C - 함수  (0) 2016.06.13

C - 함수

0x0300 : Study/0x0304 : Programming

함수? 

선언 - 정의 - 호출 로 세 가지의 상태로 사용할 수 있다.


//

선언 int add ( int a, int b );

정의 int add ( int a, int b );

       {

return a + b ;

}

호출 add ( 10, 20 );

//


함수의 정의를 내려보자!


2개의 함수로 만든 프로그램이다.

주석을 보면 알듯 2가지의 함수가 쓰여 계산되는 과정을 알 수 있다.


add라는 함수로 예시를 들어 보자. add라는 함수는 두 값을 저장한것을 temp라는 곳에 저장을 하는 함수이다.

이처럼 따로 계산을 처리시키는 함수를 생성 할 수 있다.


int add ( int x , int y )

{

// 함수의 내용 !

}


앞부터 int는 반환형 이며 다음 붙게 되는 add는 함수명이다.

int x , int y 는 매개변수이며 이후 안에 내용이 함수를 처리하게 될 내용이다.


함수유형?!

함수에는 다양한 함수 형태가 있다.

매개변수가 없을때나 반환형이 없거나 매개변수와 반환형 모두가 없을 경우가 있으며,


매개변수가 없는 경우 - int get_pos(void); 또는 int get_pos()

// 호출할 때 인수 없이 괄호만 사용한다.



반환형 변수가 없는 경우 - void print_char(char ch, int cnt);

// 반환할 때 return문을 쓰지않거나 return문만 사용한다 !

// 호출문장을 수식의 일부로 쓸 수 없다.



둘다 없따 ! - void print_title(void);

// 두가지의 특징이 포함됨.



이렇게 선언과 특징을 알 수 있다.



재귀 호출함수가 또 있는데 이는


void rec_func() {  .... rec_func (); .... }

// 함수 안에 재귀 호출을 멈추는 조건이 있어야 한다.




이러한 선언과 특징을 가진다.


// 어디까지나 선언문은 예시일 뿐이다.



'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 포인터  (0) 2016.06.13
C - 배열  (0) 2016.06.13

System - Assembly Handray

0x0300 : Study/0x0301 : System

Assembly Handray?

어셈블리 헨드레이란 어셈블리어를 c 언어로 복원시키는 것을 의미.


Assembly Instruction.

기본적인 어셈블리 명령어를 ArABoJa.


push : 스택에 특정 값을 넣고 ESP -4


pop : 특정 값에 ESP가 가리키는 값을 넣고 ESP + 4

 

nop : 아무것도 하지 않는다.


mov a, b : b를 A에 복사한다. ( a=b )


lea a, [b] : b의 주소에 있는 값을 a에 복사. ( a=*b )


cmp a, b : a와 b를 비교한다.


a > b    ZF = 0    CF = 1

a < b    ZF = 0    CF = 0

a == b  ZF = 1     CF = 0


add a, b : a와 b를 더해서 a에 결과를 넣는다. ( a+= b )


sub a, b : a와 b를 빼서 a에 결과를 넣음. ( a -= b )


imul a, b : a와 b를 곱해서 a에 넣음. ( a *= b )


xor a, b : a와 b를 xor 연산을 하여 a에 넣는다. ( a xor b )


inc a : a에 1 더함 ( a += 1 )


dec a : a에 1 뺌 ( a -= 1 )


je : 비교 값이 같은 경우 ( ZF = 1 )일때 점프한다.


jne : 비교 값이 다를 경우 ( ZF = 0 )일때 점프.


call : 해당 프로시저를 호출 (리턴값이 스택에 저장)


jmp : 해당 주소로 점프


// nop 명령어는 나중에 nop sled 기법으로 공부하면서 다시 언급 하자.


Handray!


// 시작하기전에 http://shayete.tistory.com/ 이사람 에서 공부한다. 그니깐 내가 끄적이는 것보다 저기를 추천함.

// 나는 저사람 블로그를 보고 공부한 내용을 서술하는 것 이다.. 문제되면 보호해서 암호화 할 계획.


ebp + 8 이상의 값이면 함수의 인자를 나타냄.

// int add (ebp + 8 , ebp + c , ebp + 10 )

// 3개의 함수의 인자가 나타남..


ebp - 4 , esp + 8 이상의 값은 지역변수이다.

숫자가 높을수록 가장 먼저 선언된 변수 !


mov x, y는 간단하게 x=y 이며 이게 lea x, [y] 와 같은 소리다.


인자 앞에 BYTE, WORD , DWORD 가 붙은 건 각각 1, 2, 4byte 임을 의미한다.


함수 프롤로그 밑에 sub x 가 있다는 것은 x 만큼 지역 변수가 선언해 있다는 것을 의미한다.


call x는 x라는 함수를 부른다는 뜻 인데 call 위에 보면 esp , esp + 4 , esp + 8 이 보인다. 이것은 각각 함수의 첫번째 인자 , 두번째 인자, 세번째 인자를 뜻한다.


for를 예시로 들어보자.

1    mov ebp - 0x8 , 0x0

2    cmp ebp - 0x8 , 0x9

3    add ebp - 0x8 , 0x1

2번줄 까지에 내용은 인자를 초기화 시키고 인자를 비교하는 것을 의미한다. 쭉 명령어를 실행시키고 3번째 부분에선 연산을 수행한다.

즉 ebp값이 0부터 8보다 같거나 9보다 클때 까지 1을 더한다는 의미가 된다...(맞나?)아몰랑 ^ㅡ^


// 이후 예시는 따로 참고 안함.

// 문제풀때 바로 걍 써먹었다.




" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

생각난김에 쓴 심볼릭 링크  (0) 2016.07.19
System - Return To Library  (0) 2016.06.30
System - stack? gdb?  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07

System - stack? gdb?

0x0300 : Study/0x0301 : System

Stack Corruption?


요즘에 쓰이는 buffer over flow의 말 스텍에 할당량 공간에 버퍼의 메모리를 넘치게 해서 메모리를 오염시킨다는 의미.


Kernel - os의 시스템 코드가 로드되는 부분


-- Off limit --   사용자가 접근 못하도록 남겨둔 공간


Stack - 프로그램에서 사용되는 각종 환경변수, 파라미터, 리턴, 지역변수등 있는 공간


libc - 라이브러리가 이따..


Heap - 동적 할당되는 변수의 데이터가 위치하는 영역


BSS, Data - 프로그램에서 사용하는 전역변수, 정적변수 등 각종 변수들이 실제로 위치하는 메모리 영역.

                   변수가 초기화 = > Data             초기화 X = > BSS


Code - 실제 실행되는 기계어 명령어, 어셈블리 코드가 있는 곳, 프로그램 실행시 코드 영역에 있는 어세블리 코드가 해석되어 실행


(스택 쌓이는 구조는 안올렸는데...검색하세용 낄낄 ^ㅡ^)노양심


함수 프롤로그? 에필로그?


어셈블을 하면 보게되는 내용. 말그대로 시작부분과 끝부분을 지칭한다.


프롤로그에는

push EBP

mov EBP, ESP


이는 이전 함수의 Stack Frame의 시작점을 백업 하고 새로운 Stack Frame 을 생성하는 의미.


에필로그에는

mov ESP, EBP

pop EBP


Stack Pointer를 Caller Function 의 Stack Frame 시작 주소가 저장되어 있는 곳으로 변경하고 EBP를 원래대로 복구 하는것을 의미.


Stack Frame 시작점을 백업하여 함수가 끝나고 이전 함수로 넘어갈 때 base pointer 를 복원 시켜준다. 이때 push EBP 값이 sfp이다.

그리고 mov EBP, ESP 를 하여 이 함수가 끝나는 새로운 Stack Frame 을 생성한다.

mov ESP, EBP 를 해서 sfp가 저장되어 있는 곳으로 스택 포인터를 맞추고 그걸  POP EBP, sfp를 EBP에 빼내 이전 EBP를 다시 복구시켜준다. 

그리고 ReTurn Address . Stack Frame Pointer 바로 밑에 있는 이전 함수의 리턴 주소를 EIP에 POP해서 복구.


함수 호출규약


cdecl - 부모쪽 에서 스택 복구

stdcall - 자식쪽에서 스택 복구

fastcall - 레지스터를 통해 인자 전달.


이거에 대해서는 머릿속에서 정확히 정리를 못했다. 다시 공부해야될듯..


Registers!


EIP - Extend instruction pointer :: 다음에 실행될 주소를 담고 있다.

EBP - Extend base pointer :: 함수로 전달되는 파라미터 또는 지역변수를 나타낼때의 기준.

ESP - Extend stack pointer :: 스택의 끝부분.


eip를 컨트롤 한다는것이 eip는 다음에 실행될 주소가 담겨 있다. 때문에 우리가 원하는 주소를 eip에 넣으면 거기로 건너뛰어 원하는것을 실행 가능 !


EAX - 대부분의 산술 연산에 사용되며, 함수의 반환값이 들어기도함.

EBX - 주로 주소 지정을 확장하기 위해 index로 사용된다.

ECX - 루프의 반복 횟수, 좌우방향의 쉬프트 수를 기억.

EDX - 곱, 나눗 셈에서 EAX와 같이 사용되며 부호 확장 명령 등에 쓰인다.

ESI / EDI - cpu가 현재 코드 세그먼트에서 다음에 실행할 명령어의 오프셋을 저장하는 32bit 레지스터이다.


데이터, 인덱스 레지스터이다. 걍 변수랜다. 그래도! 기억은 하자


gdb!


명령어에 대해 서술할 것이다!


gdb -q [이름] : gdb 온 !


run (r) : 바이너리 실행


continue (c) : 다음 브레이크 포인트까지 실행


quit (q) : 종료


disas [함수이름] : 특정 함수의 어셈블리 코드 출력


info

- function : 함수의 정보 출력

- break : 브레이크 포인트의 정보 출력

     - del : 모든 브레이크 포인트 제거

     - del [숫자] : 특정 브레이크 포인트 제거

- reg : 레지스터의 정보 출력


break (b * [ㅡㅡ] )

 - function (main...add...기타등등 이름) : 함수에 브레이크 포인트를 건다. 함수 프롤로그 포함.

 - address : 특정 주소에 break를 건다.


stepi (si) : 코드 한줄 실행. - 세부


nexti (ni) : 코드 한줄 실행. - 세부 x


print [function] (p) : 해당 함수 주소 출력


p $reg : 해당 레지스터 값 출력


x/[범위][출력형식][범위단위][메모리주소 나 함수명]

- x/[범위]i [address] : 특정 주소를 범위 만큼 어셈블리로 출력

- x/[범위]s [address] : 특정 주소를 범위 만큼 문자로 출력

- x/[범위]wx [address] : 특정주소를 범위만큼 16진수 4바이트 단위로 출력


set {type}[address] 특정메모리에 값을 지정 = set{int}0x000000 = 100


set $[reg] : 특정 레지스터에 값을 지정 = set $eip = 0x41414141


finsh : 현재 함수를 수행하고 빠짐


u : 현재 루프를 탈출


disas [address] [address] : 주소 사이의 어셈블리 코드를 출력




" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07
bof 기초 입문용 서적 by 달고나  (0) 2016.06.07

System - 시스템해킹이란?

0x0300 : Study/0x0301 : System

풀이나 기술적으로 무엇인가 알려줄내용은 아니다. 그냥 내가 공부한 것에 대해 끄적일 것인데...

공부를 위해서 라면 읽어보는 것도 나쁘지 않을 것이다. 그럼 시작?


시스템 해킹?


내가 크게 알고있는 내용은 없다. 하지만 특정 권한이 존재하는 취약한 바이너리를 찾아 다양한 공격기법들을 사용해 메모리 보호기법을 통과하여 해커들이 원하는 결과를 도출하는 것 이라고 생각한다.


종류?


: BOF (buffer over flow)

 - Stack corruption

 - Heap corruption

: Format String Bug

: Integer Overflow

: Use - After -Free

: Type Confusion


(사실 아는건 bof끝 ㅎ)


VIM?


리눅스에서 사용되는 프로그래밍 모듈인데..본인은 걍 프로그램써서 코딩 따로함...끙

만약에 명령어가 궁금하다 ! (검색해 ㅡㅡ)


만약 필요로 하게 된다면 나중에 다시 서술해야겠다.




" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07
bof 기초 입문용 서적 by 달고나  (0) 2016.06.07

Egg Shell

0x0300 : Study/0x0301 : System

Eggshell


에그쉘이란 bof에서 버퍼의 크기가 쉘코드의 크기보다 작아서 쉘코드를 써넣을 수 없을때 환경변수에 쉘을 등록해놓고 그 주소값만 가져와서 쉘을 띄울 수 있게 해주는 프로그램이다.


그러나 에그쉘은 환경변수에 등록 후 등록된 주소의 값을 불러오는 프로그램을 작성 해야 제대로 쓸 수 있음. 그렇기 때문에 에그쉘 코드 작석 후 한번 실행하여 "Egg"라는 이름으로 쉘코드를 환경변수에 넣어줘야 프로그램으로 에그쉘의 주소를 가져올 수 있다.



파일은 C로 첨부 했씀다...


EGG Shell.c


'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
bof 기초 입문용 서적 by 달고나  (0) 2016.06.07