#define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL) if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) { if (have_fastchunks(av)) malloc_consolidate(av); 이 부분은 fastbin 크기 이상의 청크를 free && 인접한 청크를 병합 한 뒤 실행 된다. 그래서 top chunk와 인접한 fastbin 크기 이상의 청크를 free하면 실행이 되게 된다. malloc_consolidate가 실행되면 fastbin에 있는 청크를 unsorted bin으로 옮기게 된다. 하지만 이 과정에서 인접한 청크가 free되어있으면 병합하기 때문에 조심해야한다. 이것을 통해 fastbin..
2019/09/03 - [힙(heap)/house_of_orange] - house_of_orange (2) 이전에는 아래의 조건문 중에서 앞의 조건문을 통과시켜 _IO_OVERFLOW를 실행시켰습니다. 이번에는 _mode와 _wide_data부분을 수정하여서 조건문을 만족시키는 것을 해볼 것입니다. if (((fp->_mode _IO_write_ptr > fp->_IO_write_base) || (_IO_vtable_offset (fp) == 0 && fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base)) ) 그래서 이것을 만족하게 하려면 전과는 다르게 _mode를 양수로 설정하고 _wide_data를 잘 조정..
이번에는 house of orange를 이용해서 pwnable.tw의 bookwriter라는 문제를 풀어볼 것입니다. 이렇게 함수들이 sub_~~~~~이런식으로 나오는데 실행시켰을 때 나오는 메뉴들을 통해 함수 이름을 수정하게 되면 이런식으로 수정을 할 수 있게됩니다. 첫번째 함수인 add 부터 보겠습니다. malloc을 할 크기를 입력을 받고 malloc을 하고 내용을 입력한다는 것을 알 수 있다. 그리고 i >8 이면 종료하는 것을 보아 최대 9번까지 malloc을 할 수 있을 것으로 예상됩니다. 여기서 취약점이 발생하게 됩니다. 왜냐하면 여기서 알 수 있듯이 두 변수 사이의 거리가 0x40만큼 차이가 나게되는데 9번을 할당을 하게되면 size_array[0]을 침범할 수 있습니다. 다만 size[0..
2019/09/06 - [힙(heap)/house_of_orange] - house_of_orange (4) HITCON house of orange writeup 이렇게 저번에는 hitcon 문제를 통해 실제 익스코드를 짜보았습니다. 하지만 일일이 가짜 _IO_FILE 구조체를 짜는 것은 번거로우므로 이제는 자동으로 가짜 구조체를 만들어주는 모듈을 만들어보겠습니다. 만드는 법은 간단합니다. 우리가 2번째 글에서 배운 것처럼 조건을 통과하도록 구조체를 작성해주시고 return 해주시면 됩니다. 2019/09/03 - [힙(heap)/house_of_orange] - house_of_orange (2) from pwn import * def hog(IO_list, ptr, fun): payload = '/..
저번까지 house of orange 공격기법에 대해 써봤으니 이번에는 진짜 바이너리 가지고 익스를 해보겠습니다. main 함수와 실행했을때의 모습입니다. 힙 메뉴를 가지고 있는 전형적인 문제라고 할 수 있습니다. int make_house() { unsigned int size; // [rsp+8h] [rbp-18h] signed int color; // [rsp+Ch] [rbp-14h] void *malloc_header; // [rsp+10h] [rbp-10h] _DWORD *v4; // [rsp+18h] [rbp-8h] if ( house_cnt > 3u ) { puts("Too many house"); exit(1); } malloc_header = malloc(0x10uLL); printf("..
저번까지는 가짜 구조체를 작성하는 방법에 대해 알아보았습니다. 이제는 _IO_list_all을 덮음으로서 이 가짜 구조체를 진짜라고 인식하게 하는 과정을 거쳐야합니다. _IO_list_all을 덮는 방법에 대해서는 fastbin double free, unsorted bin attack 등 여러개가 있을테지만 이번에는 unsorted bin attack을 상용할 것입니다. 여기서 1가지 문제점이 발생하는데 unsorted bin attack을 사용하여 _IO_list_all을 main_arena + 88로 덮게 되면 그 부분은 bin 관려한 정보가 있는 main_arena영역이기 때문입니다. int _IO_flush_all_lockp (int do_lock) { int result = 0; FILE *f..
2019/09/01 - [힙(heap)/house_of_orange] - house_of_orange (1) house_of_orange (1) house of orange의 핵심은 1. 먼저 top chunk의 크기를 본래 크기보다 속여서 크기가 크고 free된 청크를 만들어냅니다. 2. 그리고 가짜 _IO_FILE_PLUS와 _IO_wide_data 구조체를 만듭니다. 3. _IO_list_all을 가.. youngsouk-hack.tistory.com 2편은 1편을 보시면 더 잘 이해가 되실겁니다. 일단 저희가 1편에서 예전의 top chunk free시킴으로서 free된 크기가 큰 청크를 얻었습니다. 이번에는 1편에서 말한 가짜 구조체를 만들어야하는 이유에 대해서 알아볼 것입니다. 먼저 mallo..
house of orange의 핵심은 1. 먼저 top chunk의 크기를 본래 크기보다 속여서 크기가 크고 free된 청크를 만들어냅니다. 2. 그리고 가짜 _IO_FILE_PLUS와 _IO_wide_data 구조체를 만듭니다. 3. _IO_list_all을 가짜 구조체의 포인터가 있는 주소로 덮어씁니다. 4. 메모리 손상을 일으킵니다. 5. 그럼 _IO_flush_all_lockup()을 호출하게 됩니다. 그런데 이것은 3번에 의해 변경된 값을 참조하게 됩니다. 6. _IO_OVERFLOW()를 호출하게 되는데 이 주소값은 우리가 2번 과정으로 변조한 값이 됩니다. (ex : one_gadget으로 덮을시에 쉘) 처음 보시면 잘 이해가 안되실 수 있습니다. 고로 첫번째부터 차근 차근 알려드리겠습니다...