백준 1436 영화감독 숌 (class 2 실버5)
·
BOJ/Python
문제 666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다. 하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다. 종말의 숫자란 어떤 수에 6이 적어도 3개이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2..
[Pwnable.kr] collision
·
Hacking/System
문제 해당 포트에 접속한 다음에 그 안에 있는 파일을 바탕으로 flag를 구하면 되는 문제이다. 접속했다. col, col.c, flag 파일이 존재한다. flag 파일을 읽으려고 하니 권한이 없다고 퇴짜맞았다. col.c 파일을 읽어보았다. unsigned long hashcode = 0x21DD09EC; if(strlen(argv[1]) != 20){ printf("passcode length should be 20 bytes\n"); return 0; } if(hashcode == check_password( argv[1] )){ system("/bin/cat flag"); return 0; } argv[1]은 20bytes의 값을 가져야 한다. hashcode가 check_password를 통해 ..
[Pwnable.kr] bof
·
Hacking/System
문제 주어진 bof.c 파일이다. #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme);// smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } 취약점 분석 if(key == 0xcafebabe){ system("/bin/sh"); } func() 함수에서 key 값이 0xcafebabe이면 쉘을 출력한다. func(0xdeadbeef); main에서 실..
[Dreamhack] System Hacking Stage 12 - tcache_dup2
·
Hacking/System
문제 문제에서 주어진 코드이다. #include #include #include #include char *ptr[7]; void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); } void create_heap(int idx) { size_t size; if( idx >= 7 ) exit(0); printf("Size: "); scanf("%ld", &size); ptr[idx] = malloc(size); if(!ptr[idx]) exit(0); printf("Data: "); read(0, ptr[idx], size-1); } void modify_heap() { size_t size, idx; pri..
[Dreamhack] System Hacking Stage 12 - tcache_dup
·
Hacking/System
문제 문제에서 주어진 코드이다. // gcc -o tcache_dup tcache_dup.c -no-pie #include #include #include #include char *ptr[10]; void alarm_handler() { exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int create(int cnt) { int size; if(cnt > 10) { return -1; } printf("Size: "); scanf("%d", &size); ptr[cnt] = malloc(size..
[Dreamhack] System Hacking Stage 12 - Exploit Tech: Tcache Poisoning
·
Hacking/System
서론 해커들은 double free bug를 이용하면 free list에 어떤 청크를 중복으로 연결시킬 수 있음을 알아냈다. free list는 ptmalloc2의 동작에서 매우 중요한 기능을 하므로, 이 버그는 시스템에 심각한 오동작을 일으킬 수 있다. Tcache poisoning은 중복으로 연결된 청크를 재할당하면, 그 청크가 해제된 청크인 동시에, 할당된 청크라는 특징을 이용한다. 이러한 중첩 상태를 이용하면 공격자는 임의 주소에 청크를 할당할 수 있으며, 그 청크를 이용하여 임의 주소의 데이터를 읽거나 조작할 수 있게 된다. Tcache Poisoning Tcache Poisoning : tcache를 조작하여 임의 주소에 청크를 할당시키는 공격 기법 원리 중복으로 연결된 청크를 재할당하면, 그..
[Dreamhack] System Hacking Stage 12 - Memory Corruption: Double Free Bug
·
Hacking/System
서론 free 함수로 청크를 해제하면, ptmalloc2는 이를 tcache나 bins에 추가하여 관리한다. 그리고 이후에 malloc으로 비슷한 크기의 동적 할당이 발생하면, 이 연결리스트들을 탐색하여 청크를 재할당한다. 이 메커니즘에서, 해커들은 free로 해제한 청크를 free로 다시 해제했을 때 발생하는 현상에 주목했다. tcache와 bins를 free list라고 통칭한다면, free list의 관점에서 free는 청크를 추가하는 함수, malloc은 청크를 꺼내는 함수이다. 그러므로, 임의의 청크에 대해 free를 두 번이상 적용할 수 있다는 것은 청크를 free list에 여러 번 추가할 수 있음을 의미한다. 청크가 free list에 중복해서 존재하면 청크가 duplicated됐다고 표현..
[Dreamhack] System Hacking Stage 12 - Background:ptmalloc2
·
Hacking/System
서론 운영체제의 Memory Allocator의 핵심 역할 중 하나는 한정된 메모리 자원을 각 프로세스에 효율적으로 배분하는 일이다. 모든 프로세스는 실행 중에 메모리를 동적으로 할당하고, 할당한 메모리의 쓰임이 다하면 이를 해제한다. 이 과정은 매우 빈번하게 일어나기 때문에 운영체제의 Memory Allocator는 이 동작이 빠르고, 메모리의 낭비 없이 이뤄지도록 특수한 알고리즘으로 구현된다. 몇몇 소프트웨어는 직접 구현한 Memory Allocator를 사용하기도 한다. Memory Allocator는 구현에 사용된 알고리즘에 따라 여러 종류가 있다. 리눅스는 ptmalloc2, 구글은 tcmalloc, 페이스북이나 파이어폭스는 jemalloc을 사용한다. ptmalloc2는 메모리가 해제되면, 해..
[Dreamhack] Reverse Engineering Stage 3 - Background: Windows Memory Layout
·
Hacking/Reversing
서론 메모리 레이아웃(Memory Layout) : 프로세스 가상 메모리(Virtual Memory)의 구성 프로그램을 실행하면 운영체제는 프로세스에게 사용 가능한 메모리 공간을 할당해준다. 컴퓨터 과학에서는 이 공간을 가상 메모리라고 부른다. 운영체제는 프로그램의 정보를 참조하여 프로그램에 저장된 데이터를 적절한 영역에 저장한다. 프로세스가 사용할 가상 메모리를 용도별로 구획하고, 프로세스가 사용하는 데이터를 적절한 구획에 저장한다. 유사한 데이터를 모아놓기 때문에 운영체제는 각 구획에 적절한 권한을 부여할 수 있으며, 개발자는 프로세스의 메모리를 더 직관적으로 이해할 수 있다. 섹션 섹션 : 유사한 용도로 사용되는 데이터가 모여있는 영역 윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성되어..
[Dreamhack] Reverse Engineering Stage 2 - Background: Static Analysis vs. Dynamic Analysis
·
Hacking/Reversing
서론 소프트웨어를 분석할 때는 일반적으로 큰 구조를 먼저 관찰하지만 이것만으로 소프트웨어의 실제 동작을 알기 어려울 때가 많다. 그럴 때는 실제로 프로그램을 실행해보며 동작을 관찰해볼 수 있다. 그리고 더욱 자세한 분석이 필요할 때는 다시 여러 수단을 동원하여 특정 부분을 세밀하게 관찰한다. ​ 리버스 엔지니어링에서는 소프트웨어를 분석하기 위해 사용하는 분석 방법들을 크게 정적 분석(Static Analysis)과 동적 분석(Dynamic Analysis)으로 구분한다. 정적 분석은 외적인 관찰만을 통해 정보를 알아내는 것을 의미하며, 동적 분석은 실행을 통해 동작을 분석하는 것을 의미한다. ​ 우리는 대개 정적인 방법과 동적인 방법을 적절히 혼용하여야 대상을 효과적으로 분석할 수 있다. 동적인 방법만을..
[Dreamhack] Reverse Engineering Stage 2 - Background: Binary
·
Hacking/Reversing
서론 어떤 대상에게 명령을 내리려면, 그 대상과의 소통에 사용할 언어가 필요하다. 컴퓨터 과학자들은 컴퓨터에 명령을 내리기 위해 기계어(Machine Language)라는 컴퓨터의 언어를 정의했다. 그리고 필요한 연산을 컴퓨터가 대신하도록 기계어로 명령을 내렸다. ​ 기계어는 0과 1로 이루어져 있어서 사람이 이해하기 어려웠고, 이를 이용해서 컴퓨터에 명령을 내리는 것은 비효율적이었다. 컴퓨터 과학자들은 사람이 이해하기 쉬운 새로운 언어로 어셈블리어(Assembly Language)를 고안했고, 이를 기계어로 번역해주는 어셈블러(Assembler)를 개발했다. ​ 어셈블리어는 기계어에 비하면 효율적이었으나, 규모가 큰 프로그램을 개발하기에는 부족했다. 그래서 C, C++, Go, Rust 등을 비롯하여 ..
[Dreamhack] Reverse Engineering Stage 1 - Introduction: Reverse Engineering
·
Hacking/Reversing
리버스 엔지니어링이란 엔지니어링 : 완성품과 이를 구성하는 부품들의 기능과 설계를 고안하고, 제작하는 과정 리버스 엔지니어링(Reverse Engineering) : 엔지니어링을 거꾸로 하는 행위, 완성된 제품을 해체하고 분석하여 구조와 기능, 디자인을 파악한다. 이를 ‘역공학’이라고 지칭하기도 한다. ​ 소프트웨어 리버싱에 능숙해지기 위해서는 상당히 많은 지식과 기술 그리고 노력이 필요하다. 소프트웨어와 다양한 컴퓨팅 환경에 대한 깊은 이해를 바탕으로, 적으면 수백 줄, 길면 수만, 수억 줄의 코드로 작성된 프로그램에서 분석할 부분을 찾고, 리버싱을 막기 위해 도입된 안티 리버싱 기술들을 우회해야 한다. 수학적인 지식이 필요할 때도 있고, 필요한 도구를 직접 개발해야 할 때도 있다. ​ 해커의 기본이 ..