본문 바로가기

분류 전체보기

(62)
[ProjectH4C] [Write-up] 해커스쿨 FTZ Training 0~5 #Trainer 0 해커스쿨 FTZ에는 문제를 풀기 전에 기본 지식을 알려주기 위해 trainer가 존재한다. trainer는 총 10단계로 이루어져 있다. 해커스쿨 FTZ를 사용하려면 먼저 레드햇 리눅스가 설치된 가상머신과 ftz.iso 파일이 있어야 하는데 아래의 주소에서 받을 수 있다. blog.naver.com/wnsgus821/222028256853 실행 환경은 MacOS Katalina 10.15.6이다. 설치를 마치고 나서 리눅스를 실행 했을 때 다음과 같은 화면이 나오면, ftz login: root password: hackerschool로 입력해서 접속한다. 접속이 완료되었으면 ifconfig 명령어를 이용해 ip주소를 검색한다. eth0 부분의 inet addr를 기억해두면 된다. 이..
[ProjectH4C] [Write-up] 우리 집에 GDB 있는데... 메모리 보고 갈래? 본문 1편 : https://bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/ 2편 : https://bpsecblog.wordpress.com/2016/04/04/gdb_memory_2/ 3편 : https://bpsecblog.wordpress.com/2016/05/20/gdb_memory_3/ 본문을 보다보니 중간중간 생략 된 설명들이 굉장히 많았다. 기본적으로 알아야 할만한 내용들에 대해 생략을 했겠지만, 처음 배우는 입장에서는 흐름을 따라가기가 쉽지 않았다. 그래서 본문에서 다루는 기본적인 메모리 구조, gdb 사용법, 이를 통한 취약점 공략 까지의 내용을 최대한 생략없이 하나의 흐름으로 이해하고 작성해보고자 한다. GDB란? GNU 디버거(GNU Debug..
[ProjectH4C] 코딩도장 Unit 54~55 Write-Up 공용체 공용체란, 구조체와 정의 방법은 같지만 멤버를 저장하는 방식에 차이가 있다. 구조체는 멤버들이 각각 공간을 차지하지만 공용체는 하나의 공간에 모든 멤버가 공간을 공유한다. 그림으로 표현하면 다음과 같다. 공용체는 멤버로 선언된 자료형 중 가장 큰 자료형의 공간을 공유한다. 위의 그림의 경우 int형이 4바이트로 가장 크기 때문에 short, char 자료형이 int의 공간을 공유한다. 공용체를 정의하는 방법은 다음과 같다. union 공용체이름{ 자료형 멤버1; 자료형 멤버2; ... }; 각 멤버에 접근하는 방법이나 사용하는 법은 구조체와 동일하며 공용체도 typedef 선언과 익명 공용체 선언이 가능하다. 엔디언(Endian) 엔디언이란, 값을 메모리에 저장할 때 연속된 공간에 값을 배열하는 ..
[ProjectH4C] 코딩도장 Unit 51~53 Write-Up 구조체 활용 멤버로 문자형 변수와 정수형 변수를 하나씩 가지고 있는 구조체가 있다고 치자. 문자형은 1바이트, 정수형은 4바이트이기 때문에 구조체의 전체크기는 5바이트가 되어야 하지만, 아래의 코드에서 실제 구조체의 크기를 출력해보면 5바이트가 아닌 8바이트가 출력된다. #include struct PacketHeader { char flags; // 1바이트 int seq; // 4바이트 }; int main() { struct PacketHeader header; printf("%d\n", sizeof(header.flags)); // 1: char는 1바이트 printf("%d\n", sizeof(header.seq)); // 4: int는 4바이트 printf("%d\n", sizeof(heade..
[ProjectH4C] 코딩도장 Unit 48~50 Write-Up 구조체 보통은 필요할 때마다 변수를 하나씩 선언해서 사용하지만, 여러 개의 변수를 하나로 묶어서 한번에 관리하는 방법이 있다. 만약 인적 정보를 처리한다고 하면 이름, 나이, 주소에 관한 변수를 각각 선언해서 저장하면 되지만, 여러 사람의 인적정보를 각각 구분해서 저장하고 싶다면 코드가 굉장히 복잡해지고 비효율적이다. 이럴 때 자료를 조금 더 체계적으로 관리하기 위해 사용하는 것이 구조체이다. 기본적인 구조체 정의 방법은 다음과 같다. struct Person{ char name[20]; int age; char address[100]; }; Person이라는 구조체 안에 이름, 나이, 주소를 저장할 수 있도록 선언하는 법이다. 이렇게 정의한 구조체를 사용하는 방법은 다음과 같다. struct Perso..
[ProjectH4C] 코딩도장 Unit 46~47 Write-Up 문자열 변환 프로그래밍을 하다 보면 출력 결과는 숫자이지만 출력 형태는 문자열인 경우가 종종 있다. 이러한 경우에 문자열을 int, float 형으로 변환하거나 int, float형의 숫자를 문자열로 바꾸어주는 함수가 있다. atoi(문자열) atoi() 함수는 문자열을 정수로 바꾸어 준다. Ascii TO Integer의 약자이며, stdlib.h 헤더 파일에 선언되어 있다. #include #include // atoi 함수가 선언된 헤더 파일 int main() { char *s1 = "283"; // "283"은 문자열 int num1; num1 = atoi(s1); // 문자열을 정수로 변환하여 num1에 할당 printf("%d\n", num1); // 283 return 0; } 실행 결과 ..
[ProjectH4C] 코딩도장 Unit 41~45 Write-Up 문자열 다루기 C언어에서는 문자열을 다루는 여러가지 함수들을 제공한다. 이들은 모두 string.h 헤더파일에 선언되어 있다. 1. 문자열의 길이 문자열의 길이를 반환하는 함수로 strlen(str) 함수가 있다. 이 때 인자로 길이를 구하고자 하는 문자열이 저장된 배열 또는 포인터를 넘긴다. 반환 값은 정수 형태이다. #include #include // strlen 함수가 선언된 헤더 파일 int main() { char *s1 = "Hello"; // 포인터에 문자열 Hello의 주소 저장 char s2[10] = "Hello"; // 크기가 10인 char형 배열을 선언하고 문자열 할당 printf("%d\n", strlen(s1)); // 5: strlen 함수로 문자열의 길이를 구함 print..
[ProjectH4C] 코딩도장 Unit 39~40 Write-Up 문자열 C언어에는 문자 자료형 char가 존재하지만 문자열을 저장하는 자료형은 존재하지 않는다. 그래서 사용하는 방법이 문자열을 배열에 저장한 후에 이를 한번에 입력받아서 각각의 인덱스에 저장하고, 출력할 때도 각각을 연속해서 출력해서 문자열인 것처럼 보이도록 하는 것이다. C언어에서는 포인터를 배열처럼 구현해서 사용할 수 있는데, 이러한 개념을 가지고 문자열을 다룰 수 있다. #include int main() { char c1 = 'a'; // 변수에 문자 'a' 저장 char *s1 = "Hello"; // 포인터에 문자열 "Hello"의 주소 저장 printf("%c\n", c1); // a: %c로 문자 출력 printf("%s\n", s1); // Hello: %s로 문자열 출력 return ..