Security/개인 연구

윤성우의 열혈 C++ 책을 보면서 공부하던 도중, 오류가 있는 것 같아서 직접 해보려고한다 이 필자는 아래 코드에서 정수를 반환하며 메모리 공간이 할당되면서 초기화가 된다고 했다. int SimpleFunc(int n) { return n; } int main() { int num=10; cout
본 게시글은 free함수의 전체적인 루틴을 설명합니다. 자세한 코드분석은 나중에 따로 할 예정입니다. __libc_free free함수가 실행되면 먼저 __libc_free함수가 호출되어 __free_hook을 검사하고 값이 존재할 경우 jump 한다. 그리고 인자가 null일시에는 바로 return 을 하여 아무런 동작이 실행되지 않는다. 이후 아래 루틴을 따른다. mmap으로 할당한 청크 해제 libc_free에는 다음과 같은 루틴이 있다. if (chunk_is_mmapped (p)) /* release mmapped memory. */ { /* See if the dynamic brk/mmap threshold needs adjusting. Dumped fake mmapped chunks do n..
본 게시물은 malloc 함수에 대한 간략한 설명을 하는 곳입니다. 기초적인 heap 지식이 있다는 가정하에 작성되었습니다. (자세한 주석과 코드 분석글은 별도로 올라갈 예정입니다) 먼저 malloc 의 작동과정을 알기 이전에 arena에 대해서 간략하게 정리하겠다. Arena 우리는 main arena에 대해서는 자주 들어보았을 것 이다. arena는 heap영역을 관리하는 영역이다(fastbin, smallbin, largebin, topchunk 등등..). 멀티스레드 환경에서 heap을 관리하기 편하기 위해 만들어졌다(동기화 문제등). 그러나 스레드당 arena 가 하나씩 할당되는 것은 아니고 cpu의 물리코어 개수에 비례해서 최대 수가 정해져 있으며, 최대로 할당가능한 arena수가 넘어서게 되..
glibc 2.26 버전 이상부터 사용가능한 방법같다. 이미 누군가 찾았을 것 같긴 한데... 나는 모른다. malloc분석을 하다 발견했다. 이 방법은 tcache가 꽉차서 smallbin을 사용하다가 tcache가 비워지는 경우, smallbin에 free된 청크가 3개 있을때(이 이상도 될듯), 중간에 있는 청크의 bk를 변조가능하면 원하는 fake chunk를 tcache에 넣을 수 있다. (단, bk를 실제 smallbin에 들어간 청크로 맞추어 주어야함) if (tcache && tc_idx counts[tc_idx] < mp_.tcache_count //해당 tcache에 자리에 있으면, s..
생각보다 코드가 그렇게 길지는 않다. sysmalloc은 나중에 다룰 함수인데, 처음 할당을 받을 때 heap의 주소를 결정해주는 함수 이다. (initialize) 아무래도 다중아레나의 경우 사용되는 remove fb 같은 함수들은 뭔지 잘 모르겠어서 찾아봐야겠다. static void* _int_malloc(mstate av, size_t bytes) { INTERNAL_SIZE_T nb; /* 패딩처리된 사이즈 */ unsigned int idx; /* 인접한 bin의 인덱스 */ mbinptr bin; /* 인접한 bin */ mchunkptr victim; INTERNAL_SIZE_T size; int victim_index; mchunkptr remainder; /* 분할되고 남은 청크 */ ..
드디어 malloc의 분석을 시작해본다. tcache 2 가 적용된 최신 버전의 libc로 분석을 한다. 기본적으로 설명은 어느정도 malloc의 동작 원리에 대해 알고있다는 가정하에 설명할 생각이다. Arena 먼저 간단하게 집고 넘어가야 할 것이 있다. 바로 Arena에 관해서이다. Arena는 스레드당 할당된 heap 부분을 관리하는 곳 이라고 할 수 있다. 그래서 메인스레드에서 할당되었으면 main arena라고 부르는 것이다. 아마도 이는 속도 때문이라고 생각한다. 분석하면서도 atomic 계산의 정확도에 대한 말이 나오는 것 보면 동기화 관련한 문제 때문인 것 같다. 그러나 스레드가 많아지게 되면 공간적인 낭비가 이루어지게 때문에 최대로 할당받는 아레나의 수는 64bit에서는 8*core 개수..
환경은 ubuntu 16.04 libc-2.23이다. pwnable.tw의 seethefile이라는 문제를 풀다가 좀 궁금해져서 연구하게 됬다. fclose(fp) 를 할 때 파일 포인터가 가르키는 곳을 수정이 가능하다면 leak이 가능하다. 그리고 한가지 신기한점이 flag 조작을 잘하면 fclose가 작동안하게 만들 수 도 있다는점. 실습프로그램이다. stdout으로 진행했다. 일단 미리 magic flag들을 다 적어두었다. #define _IO_MAGIC 0xFBAD0000 /* Magic number */ #define _IO_MAGIC_MASK 0xFFFF0000 #define _IO_USER_BUF 0x0001 /* Don't deallocate buffer on close. */ #defi..
요즘은 16.04를 안쓰지만 공부를 하는 입장에서 16.04에서 썼던 잡 테크닉들을 정리 해보려고 한다. (힙이나 스택관련 기법이 아님) 16.04는 오래되서 잘 쓰이지 않지만 시스템 해킹을 입문할 때 많이 사용하고 아직도 많은 CTF 사이트에서 사용하고 있는 운영체제이다. 다른 버전들과 비교했을 때 크게 다른점은 tcache가 없다는 점이다. 또한 vtable 검사도 없다. 주로 이용하는 가젯들은 다음과 같다. 1. 원가젯 너무나도 당연하지만 그냥 넣었다. 2. setcontext+53 rdi만 컨트롤 가능하면 rsp 컨트롤이 가능해 ROP를 할 수 있는 유용한 가젯이다. 문제에서 활용은 __free_hook에 가젯을 넣거나 fake vtable에 이녀석들을 채워서 컨트롤 했던 것 같다. __free_..
OSOR2
'Security/개인 연구' 카테고리의 글 목록