분류 전체보기
[자료구조] 해적 널빤지 사형에서 살아남기 (queue)
교재 : C로 배우는 쉬운 자료구조 문제 : Chapter 06 - 응용예제 07 - 해적 널빤지 사형에서 살아남기 구분 : 원형 큐(circle queue) /*보안자료구조 응용예제 07, 해적 널빤지 사형에서 살아남기 7 3 -> 3 6 2 7 5 1 4 10 4 -> 4 8 2 7 3 10 9 1 6 5 */ #include #define MAX 100 // 1
[자료구조] 핀볼 구슬 게임의 점수는? (stack)
교재 : C로 배우는 쉬운 자료구조 문제 : Chapter 05 - 응용예제 05 - 핀볼 구슬 게임의 점수는? 구분 : 스택(stack) /*보안자료구조 응용예제 05, 핀볼 구슬 게임의 점수는? 0 0 0 0 0 0 0 2 0 4 2 0 5 3 1 30 20 40 10 20 5 1, 3 5, 3 2, 2 3, 4 2, 3 4, 5 4, 5 3, 2 1, 1 3 */ #include #define MAX_STACK_SIZE 20 int stack[MAX_STACK_SIZE][5]; //20행 5열 테이블 생성 int top[5] = { -1,-1,-1,-1,-1 }; //각 열에 대한 스택의 top pointer int IsEmpty(int col) { //해당하는 열(col)이 비어있는지 확인. if..
[picoCTF 19] Based Writeup
https://play.picoctf.org/practice nc 접속! 총 3단계로 나누어져 있고, 각 나오는 진수들을 ASCII 문자열로 나타내면 단어가 나온다. 이를 입력하면 문제를 해결할 수 있다. 파이썬 코드를 통해 각 변수에 대한 ASCII 문자를 출력해주는 코드를 짜서 풀었다. ASCII 문자 변환 코드> while True: type = int(input("(binary : 2, octal : 8, hexa : 16, exit : 0) >> ")) if (type==0): break elif (type==2): binary = list(input().split()) for i in binary: print(chr(int(i,2)), end='') elif (type==8): octal = ..
[picoCTF 19] flag_shop Writeup - 정수 오버플로우
정수 오버플로우(Integer Overflow) 문제이다. https://play.picoctf.org/practice/ 문제를 풀기 위해서 nc 접속. nc를 접속했을 때의 메뉴 선택창이 나온다. 1번을 입력하면 계좌의 현재 잔고가 나온다. 2번 메뉴에서 있는 1337 플래그를 구매하려고 하면 가격은 100000달러이고, 수량이 1개 있다고 한다. 사보려고 했지만 잔고에 충분한 달러가 없기 때문에 구매할수 없다. 2번 메뉴의 1번은 입력에서 900을 곱해서 달러를 반환해주는 것 같다. 하지만 이후 잔고를 다시 확인했을 때도 달러는 1100이다. 왜 그러는지 문제에서 소스코드를 다운받아서 확인해보자. #include #include int main() { setbuf(stdout, NULL); int c..
[자료구조] 보물찾기를 열어라! (이중 원형 연결리스트)
교재 : C로 배우는 쉬운 자료구조 문제 : Chapter 04 - 응용예제 04 - 보물상자를 열어라! 구분 : 이중 원형 연결 리스트 (Doubly Circular Linked List) (=양방향 원형 연결 리스트) 이 문제를 풀기 위해서는 특정 보물상자를 기준으로 시계방향 또는 시계반대방향으로 자유롭게 이동할 수 있어야 한다. 그러므로 양방향으로 연결된 원형리스트를 구성한다. 보물상자의 개수는 입력을 받고 이 입력받은 값에 따라 다음 보물상자의 위치를 나타내는 숫자로 입력받을 개수가 달라진다. 입력 받은 N을 malloc을 통해 동적할당을 해주고, 그 안에다가 다음 보물상자의 위치를 나타낸 숫자를 n개 입력 받는다. 열어진 보물상자는 양방향 원형리스트에서 연결을 끊고, 메모리 할당도 해제한다. 처..
버퍼 오버플로우 공격(Buffer Overflow Attack)
버퍼 오버플로우(Buffer Overflow Attack)란? - 버퍼란 데이터가 저장되는 메모리 공간이다. 이 프로그램이 실행될 때 이 메모리 공간에 버퍼의 크기보다 더 많은 입력을 받는다면 버퍼 오버플로우가 발생한다. 쉽게 말해서 크기가 정해져 있는 컵에 물을 넘치게 받았다고 생각하면 된다. 이 경우 해커가 특정 메모리 값을 임의로 변조할 수 있기 때문에 취약점이 된다. 위 그림과 같이 buf1의 크기가 5byte이고 buf2의 크기도 5byte이라고 가정해보자. 여기서 buf1 주소에 입력을 받게 되었을 때, 입력 크기를 제한해주지 않는다면, 5byte를 넘어서는 입력 값을 줄 수 있다. 이 경우 buf1의 입력을 통해 buf2의 공간의 값을 임의로 바꿀 수 있다. buf1에 'abcdefgh'라는..
함수 프롤로그 / 에필로그 (prologue / epilogue)
프롤로그 : 책의 첫머리에 서문 대신 쓴 시. 에필로그 : 시가, 소설, 연극 따위의 끝나는 부분. 프롤로그와 에필로그의 사전적 의미이다. 이처럼 프로그래밍에도 함수가 실행되고, 종료될 때도 하나의 약속처럼 프롤로그와 에필로그가 있다. 함수의 프롤로그와 에필로그는 스택 프레임을 생성하고 제거하는 역할을 한다. * 스택 : 데이터를 꺼낼 때, 마지막에 저장한 데이터가 먼저 꺼내진다. 후입선출(LIFO - Last In First Out) 구조 * 스택 프레임 : 함수가 호출될 때 스택 메모리가 할당되고, 종료 시 호출하기 전에 저장한 주소로 복귀한다. main 함수가 수행되는 과정에서 A 함수가 실행될 경우, 그림과 같이 A 함수의 스택 프레임이 생성된다. 이 사진은..
[자료구조] 연결리스트 역순 알고리즘
노드의 구성은 data와 *next 변수로 구성되어 있다. 노드의 *next 주소 흐름은 100(head) -> 200 -> 300 -> 400 -> NULL이다. 이 흐름을 역순, 즉 반대로 400 -> 300 -> 200 -> 100 -> NULL으로 바꾸는 알고리즘을 생각하는 것이 과제이다. 반복문과 재귀함수를 이용해서 두가지 방법으로 알고리즘을 구현할 수 있었다. 1. 반복문을 이용한 알고리즘 : 앞 노드부터 흐름을 바꾸면서 뒤 노드로 진행한다. 2. 재귀함수를 이용한 알고리즘 : 노드의 끝까지 타고 들어가서 뒤 노드부터 흐름을 바꾸면서 앞 노드로 돌아온다. 1. 반복문을 이용한 연결리스트 역순 알고리즘 처음으로 생각하게 된 알고리즘은 앞 노드부터 한 칸씩 *next 포인터를 역순으로 설정해주는 ..