전체 글

[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 포인터를 역순으로 설정해주는 ..

함수 호출 규약(Calling Convention)
함수 호출 규약(Calling Convention) - 함수를 호출하는 방식에 대한 약속. 1) 인자 전달 방법 2) 인자 전달 순서 3) 스택 프레임 정리 방법 스택 프레임(Stack Frame) - 함수를 호출할때 상위에서 진행되던 함수를 저장하고, 인자를 전달하기 위해 스택 프레임의 구조를 사용한다. main 함수가 실행되는 과정에서 A 함수가 호출된다면, A함수에 대한 인자를 약속된 순서대로 스택 프레임에 저장한다. 그 다음 A 함수가 끝나고 되돌아 올 주소(RET)와 A 함수가 실행되기 전의 EBP의 값(SFP)을 스택에 push한다. 이후 A 함수가 끝나면, A 함수의 스택 프레임은 정리되고 RET와 SFP 값을 통해 main 함수의 스택 프레임으로 돌아오게 된다. x86 아키텍처에 사용되는 ..
[linux] source ~/.bashrc 에러 command not found: shopt
나는 zsh을 쓴다.. 그런데 환경변수 추가하려다가 에러가 났다.. .bashrc:16: command not found: shopt .bashrc:24: command not found: shopt .bashrc:115: command not found: shopt /usr/share/bash-completion/bash_completion:45: command not found: shopt /usr/share/bash-completion/bash_completion:1512: parse error near `|' \[\e]0;\u@\h: \w\a\]\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$ zsh를 사용하면 .zshrc에 환경변수..