본문 바로가기

분류 전체보기

(10)
명품 c++ 책 open challenge - human eat food 명품 c++ human eat food 하면서, 약간 가상함수의 개념을 살짝 익힌것 같아요 ㅠㅠ 그래도 아직 가상함수를 잘 사용할러면 좀더 이해가 필요할 것 같아요 ㅠㅠ 5개의 파일로 분리해서 만들었어요. Game.hpp, GameController.hpp, Game.cpp, GameController.cpp, main.cpp // Game.hpp #ifndef __GAME_HPP__ #define __GAME_HPP__ class GameObject { protected: int distance; // 한번 이동 거리 int x,y; // 현재 위치 x: 왼쪽, 오른쪽 y: 위,아래 public: // 초기 위치와 이동거리 설정 GameObject(int startX,int startY, int dis..
offsetof macro 와 container_of macro 먼저 offsetof 매크로 먼저 살펴볼게요. offsetof 매크로는 아래와 같이 정의되어 있어요. #define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER) offsetof는 커널에서 double linked list 관련 소스를 볼 떄 접할 수 있어요. 그 외에도 다양한 곳에서 자주 사용되요. offseetof는 표준 라이브러리 가 include 하게 되면 사용할 수 있고, 이 매크로를 이용해서 특정 구조체 멤버의 offset을 구할 수 있어요. 그 다음으로 container_of 매크로를 살펴볼게요. container_of 매크로는 디바이스 드라이버 작업을 하다 보면 자주 보게 되는 매크로라고 해요. container_of 매크로는 아래와 같..
삽입 정렬(insertion sort) 삽입 정렬(insertion sort)은 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교 하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다. 즉, 매 순서다 해당 원소를 삽입할 수 있는 위치를 찾아 해당 위치에 넣는다. 삽입 정렬은 두 번째 자료부터 시작하여 그 앞의 자료들과 비교하여 십입할 위치를 지정한 후 자료를 뒤로 옮기고 지정한 자리에 자료를 삽입하여 정렬하는 알고리즘이다. 처음 key 값은 두 번째 요소부터 시작한다. 안정된 정렬 방법이며, 레코드의 수가 적을 경우 알고리즘 자체가 매우 간단해서 다른 복잡한 정렬보다 유리할 수 있고, 대부분의 배열이 이미 정렬되어 있는 경우에 매우 효율적일 수 있다. 하지만 다른 정렬에 비해 배열들의 이동이 자주 일어나므로..
선택 정렬(selection sort) 선택 정렬(selection sort)은 제자리 정렬 알고리즘중 하나이다. 입력 배열 이외에 다른 추가 메모리를 요구하지 않고, 해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 어떤 원소를 넣을지 선택하는 알고리즘이다. 따라서 자료 이동 횟수가 미리 결정되어 있지만, 같은 값이 같은 배열에 있을 경우에 상대적인 위치가 변경될 수 있어서 안정성을 만족하지 않는다. #include #define SIZE 5 void selection_sort(int arr[],int n); int main() { int arr[SIZE]={9,6,7,3,5}; selection_sort(arr,SIZE); for(int i=0;i
버블 정렬(bubble sort) 버블 정렬(bubble sort)는 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘 이라고 합니다. 버블 정렬은 구현이 매우 간단하지만, 하나의 요소가 가장 왼쪽에서 가장 오른쪽으로 이동하기 위해서는 배열에서 모든 다른 요소들과 교환되어야 한다고 합니다. 이에 따라 존재하는 정렬 알고리즘중 시간복잡도가 가장 커서 거의 사용되지 않는 정렬 알고리즘입니다. #include #define SIZE 5 void bubble_sort(int arr[],int n); // 오름차순 void bubble_sort_reverse(int arr[], int n); // 내림차순 void print_arr(int arr[],int n); // 출력 int main() { int i,j,tmp; int arr[SIZE]=..
pwnable.kr unlink - writeup unlink@ubuntu:~$ cat unlink.c #include #include #include typedef struct tagOBJ{ struct tagOBJ* fd; struct tagOBJ* bk; char buf[8]; }OBJ; void shell(){ system("/bin/sh"); } void unlink(OBJ* P){ OBJ* BK; OBJ* FD; BK=P->bk; FD=P->fd; FD->bk=BK; BK->fd=FD; } int main(int argc, char* argv[]){ malloc(1024); OBJ* A = (OBJ*)malloc(sizeof(OBJ)); OBJ* B = (OBJ*)malloc(sizeof(OBJ)); OBJ* C = (OBJ*)malloc(s..
unlink 취약점? pwnable.kr unlink 문제를 풀어보기 위해서 , unlink 취약점에 대해서 찾아 봤어요. 처음에 봤을 때는, 하나도 이해가 안 갔지만 ㅠㅠㅠㅠ 그래도 계속 읽다보고 생각하다보니까 아주 조금 이해가 됬어요 ㅠㅠ. 조금이라도 더 기억하기위해서 한번 끄적여 볼게요. malloc을 통해서 동적할당을 다음과 같이 한다고 생각해 보죠. --> malloc(32) 그렇다면 32바이트만큼 할당이 되어야할 것 같지만, 실제로는 40바이트가 할당이 됩니다. 왜 그럴까요? 바로, 할당된 메모리를 관리하기 위한 정보들이 포함되어 있기 때문이에요! 그러한 정보는 chunk라고 불리는 구조체를 통해 할 수가 있어요. 동적할당된 메모리는 chunk라고 불리는 구조체로 관리를 하고 있어요. 이 구조체는 다음과 같이 구성..
버퍼 오버플로우(Buffer Overflow == BOF) 개념을 알아보자. bof, bof_notvul 두개의 프로그램을 가지고 있다고 생각하자. 하나는 버퍼 오버플로우의 취약점을 가진 프로그램이고, 하나는 버퍼 오버플로우의 취약점을 없는 프로그램이다. 먼저 버퍼 오버플로우 취약점을 가지는 프로그램인 bof를 제공된 exploit 방법으로 공격을 시도했다. 공격은 다음과 같이 성공했음을 알 수 있다. 그 후, 취약점이 패치된 프로그램인 bof_notvul을 제공된 exploit 방법으로 공격을 시도했다. 하지만 다음과 같이 공격이 실패했음을 알 수 있다. 혹시 bof_notvul 프로그램에는 리눅스의 보호기법인 NX bit, no pie, ASLR, SSP등 설정이 되어있는지 확인하기 위해서 checksec 이라는 쉘 스크립트를 사용했다. 간단히 보호기법에 대해 설명을 하자면,..