시스템 해킹 17

64bit 아키텍쳐 - FSB를이용한 memory overwrite - format-two 문제 해결

memset 함수 memset(buf,0,sizeof(buf)); → buf라는 공간에 데이터를 sizeof(buf)만큼 0으로 채워라. 256 바이트 strncpy 함수미지수 n미지수 n은 특정한 수를 나타낼 때 사용. strncpy는 특정 바이트만큼만 복사를 하겠다. strncpy(buf, argv[1], sizeof(buf)) argv[1] 만약 argv[1]의 문자열이 sizeof(buf) 바이트를 넘어가면 sizeof(buf) 바이트까지만 복사. 256 바이트 즉, BOF가 발생하지 않는다. 코드 분석format-two.c//FSB 취약점만을 사용해 특..

64bit 아키텍쳐 - FSB 이용 BOF 공격 - format-one 문제 해결

코드 분석format-one.c// FSB를 이용하여 BOF를 발생시켜 특정 변수에 우리가 원하는 값을 넣어보자.// Format String Bug(FSB)에 대해서 배우고 FSB를 이용한 BOF를 통해 공격을 성공시켜 보자.#include //#include는 미리 정의된 함수가 있는 라이브러리를 사용하겠다.#include #include #include #include #define BANNER \"Welcome to " LEVELNAME ", brought to you by https://exploit.education"int main(int argc, char **argv){ // 프로그램 실행 시 실행되는 함수. struct{ char dest[32]; //32 바이트 공간을 받는 변수를 ..

64bit 아키텍쳐 - BOF (쉘 코드 실행) - stack-five 문제 해결

코드 분석// BOF 이용햬 우리가 원하는 코드(쉘 코드)를 실행시켜보자.#include // #include는 미리 정의된 함수가 있는 라이브러리를 가져와 사용.#include #include #include #define BANNER \"Welcome to " LEVELNAME ", brought to you by https://exploit.education"char *gets(char *); // 라이브러리에 정의되어있는 gets 함수를 사용하겠다.void start_level(){ // 사용자 정의 함수 start_level() 정의 char buffer[128]; // 128바이트의 공간을 가지는 변수를 선언. gets(buffer); //유저가 입력한 입력 값을 buffer에 저장.}int..

64bit 아키텍쳐 - BOF (Return Address 조작) - stack-four 문제 해결

코드 분석stack-four.c//간단하게 Stack의 구조 이해, Return Address에 대해서 배우고//BOF를 활용해 Return Address를 조작해 우리가 원하는 함수를 호출해보자.#include //#include는 미리 정의된 함수가 있는 라이브러리를 사용.#include #include #include #include #define BANNER \"Welcome to " LEVELNAME ", brought to you by https://exploit.education"char *gets(char *); //gets라는 함수가 이미 라이브러리에 정의되어 있는데, 해당 함수를 우리가 사용하겠다.void complete_level(){ // 사용자 정의 함수를 정의. printf("..

포인터 & 함수 포인터 - stack-two 문제 해결

포인터 & 함수 포인터 Get Environmentgetenv()환경 변수의 값이 있는 주소를 반환하는 함수 . 환경 변수는 키와 값이 1 대 1 로 매칭되는 데이터베이스와 같다 . Key=Valuewindir=C:\Windowsgetenv(ˮwindirˮ); 코드 분석stack-two.c// 키보드로 입력할 수 없는 문자를 프로그램에 입력시켜보자// enter, backspace 같은거#include // #include : 미리 정의된 함수가 있는 라이브러리를 가져와 사용.#include #include #include #include #define BANNER \"Welcome to " LEVELNAME " , brought to you by https://exploit.education"int..

64bit 아키텍쳐에서의 BOF - stack-one 문제 해결

코드 분석stack-one.c#include #include // #include는 미리 정의된 함수가 있는 라이브러리를 가져와 사용하겠다.#include #include #include #define BANNER \"Welcome to " LEVELNAME ", brought to you by https://exploit.education"int main(int argc, char **argv){ // 프로그램이 실행되었을때 실행되는 함수. // argc : argument count , argv : arguments // ./stack-one 123 456 789 // argument count : 4 struct{ char buffer[64]; // 버퍼라는 이름의 64 바이트 저장 공간을 선언..

UAF 취약점 - uaf2 문제 해결

코드 분석#include #include #include // system 함수를 사용하기 위해 추가typedef struct test { char *name[50]; // 4*50 = 200 바이트 void (*greetings)(void *name); // void 반환, void* 매개변수 void (*bye)(void *name); // void 반환, void* 매개변수 } VULN;void say_hello(void *name) { // 반환 타입을 void로 수정 printf("Hello! %s\n", (char*)name);}void say_goodbye(void *name) { // 반환 타입을 void로 수정 printf("ByeBye! %s\n", (char*)name);}..

UAF와 BOF 연계 - uaf1 문제 해결

코드 분석uaf.c// BOF와 UAF의 연계 공격#include // #include는 미리 정의된 함수들이 있는 라이브러리를 가져와 사용.#include // typedef 특정한 자료형에 대해서 별명을 지정하겠다. -> VULN으로 별명 지정.typedef struct test { // test라는 이름의 구조체 정의 char *name[50]; // 4*50 = 200 바이트 버퍼 선언. // 32비트 시스템에서는 char* 크기가 4바이트입니다. // 64비트 시스템에..

UAF (Use After Free) 취약점 - heap2 문제 해결

UAF (Use After Free)malloc, calloc, reallocfree free => malloc, calloc, realloc을 통해 할당 받은 공간을 사용하지 않게 될 경우, 시스템에게 해당 메모리를 다시 반환하는 함수이다. 예시example.c#include #include #include // struct a 정의: 함수 포인터 fp와 이름 name을 포함struct a { void (*fp)(); // 함수 포인터로 priority 변경 char name[32];};// struct b 정의: 이름 name과 함수 포인터 fp를 포함struct b { char name[32]; void (*fp)(); // 함수 포인터};// 함수: "Winner!" 출력void wi..

strcpy() 이용해서 GOT Overwrite - heap1 문제 해결

이번 문제는 문자열 복사 함수인 strcpy()를 이용하여 GOT 영역을 덮어씌워 프로그램의 흐름을 바꾸는 방식으로 해결했다. 코드 분석heap1.c// Heap Buffer Overflow와 동적 할당 그리고 GOT Overwrite 기법 연계#include // #include는 미리 정의된 함수들이 있는 라이브러리를 가져와 사용.#include #include #include #include struct internet{ //internet이라는 이름의 구조체를 정의 int priority; //4 바이트 priority 멤버 변수를 선언. char *name; // 4바이트 name 멤버 변수를 선언.(포인터)};void winner(){ printf("and we have a winner @..