본문 바로가기

분류 전체보기115

[자료구조] 연결리스트 PART.1 1. 연결 자료구조(Linked Data Structure) 자료의 논리적인 순서와 물리적인 순서가 일치하지 않는 자료구조 각 원소에 저장된 다음 원소의 주소에 의해 순서가 연결되는 방식 물리적인 순서를 맞추기 위한 오버헤드가 발생하지 않음 여러 개의 작은 공간을 연결하여 하나의 전체 자료구조를 표현 크기 변경이 유연하고 더 효율적으로 메모리 사용 리스트를 연결 자료구조로 표현한 구조 연결하는 방식에 따라 단순 연결 리스트와 원형 연결 리스트, 이중 연결 리스트, 이중 원형 연결 리스트가 있음 2. 연결 리스트의 구성 1) 노드 연결 자료구조에서 하나의 원소를 표현하기 위한 단위 구조 (1) 노드의 구조 노드의 구조 데이터 필드 링크 필드 2) 데이터 필드(data field) 원소의 값을 저장 저장할 .. 2020. 6. 19.
[자료구조] 선형리스트 1. 선형리스트의 개념 1) 리스트 자료의 목록 배열 2) 선형리스트 순서 리스트(Ordered List) 자료 간에 순서를 갖는 리스트 (1) 선형리스트 예 - 요일 일 월 화 수 목 금 토 - 요리 분야 (순서가 없지만, 선형리스트 일부분이다.) 한정식 중식 일식 분식 양식 3) 리스트의 표현 방식 리스트 이름 = (원소1, 원소2, 원소n) 선형 리스트에서 원소를 나열한 순서는 원소들의 순서가 됨 4) 선형 리스트의 저장 원소들의 논리적 순서와 같은 순서로 메모리에 저장 5) 선형 리스트에서의 원소 삽입 선형리스트 중간에 원소가 삽입되면 그 이후의 원소들은 한 자리씩 자리를 뒤로 이동하여 물리적 순서를 논리적 순서와 일치시킨다. (1) 원소 삽입 방법 원소를 삽입할 빈자리 만든다. - 삽입할 자리 .. 2020. 6. 19.
[자료구조] 개념 PART.2 자료의 표현 - 포인터 자료 포인터(pointer)의 개념 - C언어에서 가장 큰 특징을 포인터라고 말하는 사람들이 많다. 그만큼 포인터는 C언어의 대표적인 특징이자 C언어를 강력하게 만드는 존재다. 포인터로 인해 메모리 접근이 가능하므로 저급 언어의 특징을 갖게 하는 존재이며 때로는 잘못된 포인터의 연결로 오류를 만드는 C언어의 최대 약점이 될 수도 있는 존재다. 그래서 자바에서는 포인터를 제외하고 포인터와 비슷한 참조형을 만들었다. - 일반적인 변수들은 각자 선언된 자료형의 상숫값을 그 변수의 기억되는 값으로 저장하게 되지만 포인터 또는 포인터 변수는 메모리의 주솟값을 가지는 변수를 말한다. 주 메모리는 주소라는 개념으로 프로그램에서 접근하게 되는데 이 주솟값을 포인터 변수가 가지게 되는 것이다. 포.. 2020. 6. 18.
[자료구조] 개념 PART.1 자료구조의 개념 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법 신중히 선택한 자료구조는 더 효율적인 알고리즘을 사용할 수 있게 한다. 자료구조의 선택문제는 대개 추상적 자료구조의 선택으로부터 시작하는 경우가 많다. 효과적으로 설계된 자료구조는 실행시간 혹은 메모리 용량과 같은 자원을 최소한으로 사용하면서 연산을 수행하도록 해준다. 자료구조의 필요성 컴퓨터가 효율적으로 문제를 처리하기 위해서는 문제를 정의하고 분석하여 그에 대한 최적의 프로그램을 작성해야 해서 자료구조에 대한 개념과 활용 능력이 있어야 한다. 형태에 따른 자료구조의 분류 자료구조 단순구조 정수 실수 문자 문자열 선형구조 리스트 연결리스트 스택 큐 데큐 선형구조 - 연결리스트 단일 이중 원형 비선형구조 트리 그래프 비선형구조 -.. 2020. 6. 18.
[C] 자료구조 이 카테고리는 각 언어의 기본적인 개념과 이론적인 내용을 포스팅함으로 각 언어의 깊이 있는 공부를 위해 만들었다. 처음 컴퓨터 언어를 공부할 때 각 언어에 대한 기본적인 사용법을 공부하고 바로 모의해킹, 문제풀이 등으로 공부하면서 포스팅을 했다. 기본적인 사용법보다 조금 깊은 개념, 이론 공부보다는 모의해킹과 문제풀이에 필요한 내용만 공부하며 문제를 풀었고 조금 깊이 있는 개념, 이론들은 자세히 모른다. 그래서 이번에는 조금 깊이 있는 개념, 이론을 공부하려고 한다. 그 첫 번째는 자료구조다. C언어 자료구조 포스팅은 경기도지식(GSEEK)에 있는 강의를 통해 공부했다. 2020. 6. 17.
해커스쿨 L.O.B 0x2f 없는 Shell Code 실습 해커스쿨 F.T.Z에서도 해봤던 Shell Code 실습이지만 조금 다른 실습을 한다. 지금까지 사용해오던 셸 코드가 있다. \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80 위 셸 코드에서 "0x2f"를 없애려고 한다. 해커스쿨 L.O.B level 7에서 배운 argv[0] 즉, 파일 이름에 셸 코드를 넣어야 할 때가 있다. 파일 이름에 "0x2f" 즉, "/"이 문자가 들어있으면 경로로 인식되어 셸 코드가 제대로 작동되지 않으므로 보통의 셸 코드를 사용할 수 없다. 기존 사용하던 셸 코드의 어셈블리 언어다. 컴파일하고 실행하면 셸이 실행되는 것을 볼 수 있다. objdu.. 2020. 6. 6.
해커스쿨 L.O.B level 7 [darkelf] darkelf 로그인 후 파일을 확인한다. 코드 파일을 확인한다. 힌트와 추가된 부분까지만 보겠다. 추가된 부분을 분석한다. argv[0]이 77이 아니면 if 문을 실행한다. 코드는 아주 간단하다. 지금까지 argv[1], argv[2]를 사용해서 argv[0]이 어떤 것인지는 알 순 있지만 어떻게 해야 할지 고민이 많아진다. gdb로 메모리 분석한다. 이때, 추가된 부분만 가져오겠다. level 6 [wolfman]에서 배운 어셈블리 언어의 if 문의 분석 방법을 통해 분석한다. strlen 함수를 부르고 cmp로 "%eax, 77"을 비교한다. 여기서 %eax 레지스터에는 argv[0]이 들어있고 77과 비교한다. 코드에서는 "!=(JNE)"인데 대우 명제를 취해 "==(JE)"를 사용해 argv[.. 2020. 5. 28.
해커스쿨 L.O.B level 6 [wolfman] wolfman 로그인 후 파일을 확인한다. 코드 파일을 확인한다. 코드 시작 전 힌트를 보면 level 5 [orc] 문제에서 "check length of argv[1]"가 추가되었다. 추가된 코드를 분석해보면 "argv[1]"의 길이가 48보다 크면 문자열을 출력하고 프로그램을 종료시킨다. 이전 문제들을 잘 풀었다면 추가된 if 문에서 막히지 않을 것이다. 왜냐하면, 지금까지 두 번째 if 문에서 "agrv[1][47]"에서 '\xbf'가 들어가고 끝나므로 즉, 47byte에서 끝나고 48byte까지 가지 않아서 생각할 필요가 없어지고 이전 문제들과 같아진다. gdb로 메모리 분석한다. 이때, 추가된 코드와 메모리 스택만 하겠다. strlen 함수를 부르고 cmp로 비교한다. JBE(JLE와 비슷) .. 2020. 5. 25.
해커스쿨 L.O.B level 5 [orc] orc 로그인 후 파일을 확인한다. 코드 파일을 열어 코드를 분석한다. level 4 [gobilin] 문제와 비슷한데 buffer hunter가 생겼다. level 4에서 배운 memset을 분석하면 buffer 변수의 메모리를 0으로 40byte만큼 초기화한다. gdb로 메모리를 분석한다. 이때, 권한문제를 피해 복사해서 열어야 하는 건 많이 해서 이제는 알 것이다. 이전 메모리들은 이전 문제와 같고 이 부분만 추가됐으므로 이 부분문 가져왔다. 어셈블리 코드를 보지 않아도 될 정도다. 주소만 보자면 "ebp-40"이고 메모리 스택을 도식화해본다. int i 4byte char buffer[40] 40byte SFP 4byte RET 4byte 여기서도 변수 i는 신경 쓰지 않아도 되고 dummy도 들.. 2020. 5. 21.
해커스쿨 L.O.B level 4 [goblin] goblin 로그인 후 파일을 확인한다. 코드 파일을 열어 코드를 분석한다. extern extern이란 외부변수의 선언이다. 함수를 작성할 때 원형 선언과 정의를 분리할 수 있는 것처럼, 변수도 외부변수 선언과 정의로 구분 할 수 있다. 그뿐만 아니라 함수처럼 외부변수 선언만 있고 정의가 빠지면 컴파일 오류가 아닌 링크 오류가 발생한다. 외부변수의 선언은 일반 변수의 선언과 같은 형식으로 기술하지만, 자료형 앞에 extern 예약어를 붙이면 된다. 그러나 절대로 초깃값을 명시하면 안 된다. 초깃값을 명시하면 '선언 및 정의'가 되어버리기 때문이다. extern 예약어는 문법상 '기억 부류 지정자'다. 외부변수라는 말의 의미는 변수의 정의가 현재 파일이 아니라 다른 파일(외부 파일)에 존재한다는 의미다... 2020. 5. 18.