Reference/Pwnable_Study

    [Pwn] Overwrite _rtld_global

    드림핵의 Overwrite _rtld_global 를 좀 더 이해하기 위해 정리하고자 작성한 글입니다. (틀린 내용이 있다면 댓글로 지적해주시면 감사드립니다.) _rtld_global 개념 _rtld_global 이 무엇인지 부터 알아보겠습니다. pwn이나 여러 바이너리 파일을 분석해보면 개발자가 main이라는 함수를 작성해서 실행했을때 main함수가 바로 실행되지 않는 다는 점은 디버깅을 하면 가장먼저 알게되는 구조입니다. 그러면 이후에 종료되는 과정이 정확하게 어떻게 되는가? gdb-peda$ disas main Dump of assembler code for function main: 0x00000000000005fa :push rbp 0x00000000000005fb :mov rbp,rsp 0x0..

    tcache double free bypass

    드림핵 워게임 문제를 풀다가 막혀 강의자료를 정리한 글로 잘못된 내용이 있을 수 있습니다. 1. GLIBC 2.26과 2.29 버전 차이이전 double free bug에 대해 정리하면서 2.29버전에서는 이를 막기위한 코드가 추가되었다고 언급했었습니다.추가된 코드 부분은 tcache를 관리하는 tcache_entry 구조체 부분과tcache_put, tcache_get 함수를 보면 알 수 있습니다. 먼저 tcache_entry 부분을 비교해보면key라는 멤버 변수가 추가되었고 이는 duble free 발생여부를 확인하기 위해 존재한다고 합니다. tcache_put 부분에서 변경된점은 e->key=tcache 입니다.e->key에 tcache를 삽입하는데 이 의미는 tcache_entry 구조체 주소를k..

    DFB(Double Free Bug) 취약점

    본 글은 드림핵로드맵을 진행하면서 공부 이해를 돕기 위해 작성한 문서입니다. Double Free Bug 이전 Heap 이해에 대한 글을 작성하면서 free 함수로 청크를 해제한다면 (리눅스의 경우) ptmalloc2가 tcache나 bins에 추가하여 관리한다고 학습했고 이후 malloc 함수로 비슷한 크기의 동적할당이 발생하면 연결리스트를 참고해 재할당해준다는 것까지 확인했습니다. 이러한 매커니즘을 기반으로 free를 두번 시도할 경우 발생하는 취약점이 DFG( Double Free Bug )입니다. 언뜻 생각한다면 두번 free를 한다고 어떠한 문제가 생기는가 할텐데 heap 메모리의 할당과 해제시 할당한 영역의 크기는 요청한 사이즈보다 크다는 것과 그 이유가 청크 사이즈와 이전, 다음 청크를 가르..

    (Linux) Heap 구조 이해하기 1

    드림핵 시스템해킹 로드맵을 진행하던중 heap에 대한 배경지식 부족으로Exploit Code이해에 어려움이 있어 이해하고자 여러 자료를 참고삼아 작성한 글입니다.( 잘못 이해하거나 틀린점에 대한 조언은 언제나 환영입니다!  ) Heap먼저 heap 영역이란, malloc(), calloc() 같은 함수를 통해동적으로 할당받는 메모리가 위치하는 영역을 말합니다. 보통 지역변수나 전역변수는 변수의 사이즈가 컴파일 시에 결정됩니다.이렇게 선언된 변수의 사이즈는 고정값으로 변경하지 못하는데 컴파일 시 정해지지 않고런타임 시에 변수의 사이즈가 정해지는 구조가 있는데 이런경우 힙 영역에 할당이 되는 것입니다. 즉 정리하면 heap 영역은 런타임때 할당메모리 크기가 결정되는메모리가 위치하는 영역이라 볼 수 있습니다...

    OOB(Out of Bounds) 취약점

    본 글은 드림핵 시스템해킹 로드맵 Stage 9를 학습하고개인적으로 정리한 글입니다. OBB (Out of Bounds)지금까지 여러 워게임 및 CTF문제, 개발등을 하면서 자연스레 배열을 사용해왔습니다.배열 내부 자료를 요소, 요소의 위치를 인덱스라고 하며 파이썬 같은 인덱스 슬라이싱 같은 배열을 다뤄왔습니다.이러한 배열에 인덱스를 이용해 임의의 주소로 접근이 가능한 취약점이 존재합니다.이는 개발자가 설정한 배열의 경계를 넘어서 값을 읽거나 쓸수 있어 코스를 벗어났다는 의미로Out Of Bounds라고 하여 OBB라고 합니다. 보통 배열의 길이는 array[n] = sizeof(요소) * n 으로 결정됩니다.그렇다면 array[n]에 들어가는 n 즉, 인덱스 값이 음수 이거나 배열의 길이를 벗어나면 어..

    Pwndocker와 LD_PRELOAD, patchelf (libc 제공된 바이너리 문제)

    이전 글에서 RELRO과 Hook Overwrite에 대하여 작성한 적이 있습니다.Exploit Code를 구성하는 과정은 워게임혹은 예시문제에서 설명한다고 했으나환경셋팅에 대한 문제에 가로막혀 Pwndocker를 통한 해결책에 대해 작성하게 되었습니다. PwndockerHook Overwrite 문제들 처럼 라이브러리를 사용해 문제를 해결하는 워게임들은대부분 라이브러리 영역의 주소를 찾기 위해 아래처럼 라이브러리 파일을 제공합니다.하지만 이렇게 제공되는 라이브러리는 현재 본인이 사용하고 있는 커널 버전과 환경의 문제로라이브러리를 제대로 로드할수 없게 되는 경우가 생깁니다. 예전 방식의 해결방법은위의 버전과 같은2.27을 가진 리눅스 가상환경을 따로 준비하고해당환경에서 풀어나가는 방법을 사용했습니다.문제..

    RELRO 과 Hook Overwrite, PIE

    Dream hack 자료를 통해 학습한 RELRO 보호기법과 Hook Overwrite를 정리한 글입니다. RELRO 라는 보호기법을 이해하기 위해서는 ROP에 대한 기본적인 내용이해가 필요합니다. RELRO 이전에 Dream hack문제를 해결할때 ROP 공격기법을 사용해 본적이 있습니다. 이때 함수의 주소를 구하기 위해 PLT를 사용하고 GOT에 값을 덮어쓰는 방식을 사용했습니다. 그런데 여기에는 전제조건이 필요합니다. GOT에 쓰기 권한이 부여되어 있어야만 한다는 조건입니다. 그리고 개발자들은 데이터 보호와 이러한 취약점을 해결하기 위해 쓰기 권한을 제거하는 RELocation Read-Only(RELRO) 를 개발하였습니다. 정리하면 RELRO는 쓰기 권한이 불필요한 data segment의 쓰기..

    fork()와 exev()

    fork() & exec() fork() 와 exec()는 모두 한 프로세스가 다른 프로세스를 실행시키기 위해 사용하는데 간단히 보자면 정리하면 프로세스를 복사하거나 덮어쓰는 방식의 차이라고 할 수 있다. exec에는 execv나 execl 등 여러가지 함수등을 포함하고 있다. fork() 먼저 fork() 시스템 호출은 호출한 프로세스를 새로운 공간에 전부 복사하여 새로운 프로세를 위한 메모리를 할당하고 원래 프로세스는 그대로 작업을 수행하며, 복사된 프로세스는 fork()가 수행된 다음라인 부터 실행이 된다. (복사한 프로세스므로 똑같은 코드를 지니고 있음) fork()는 사용시 현재 프로세스를 부모 프로세스라고 하며, 만들어진 프로세스를 자식 프로세스라고 한다. 여기서 fork가 리턴하는 값 pid..