이번에는 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으로 덮을시에 쉘) 처음 보시면 잘 이해가 안되실 수 있습니다. 고로 첫번째부터 차근 차근 알려드리겠습니다...
/* ----------- 시스템 할당을 다루기 위한 함수이다. -------------- */ /* sysmalloc은 시스템으로부터 더 많은 메모리를 요구하는 경우(즉 top chunk의 크기가 부족할 때) 실행된다. 시작부분에, av->top(top chunk)이 요청한 크기를 할당하기에 충분한 크기가 없다고 추정된다. 그러므로 av->top(top chunk)가 확장되거나 대체될 필요가 있다. */ static void * sysmalloc (INTERNAL_SIZE_T nb, mstate av) { mchunkptr old_top; /* incoming value of av->top */ INTERNAL_SIZE_T old_size; /* 그것의 크기 */ char *old_end; /* 그것의..
https://lclang.tistory.com/165 malloc_hook => free get shell 개쩔었다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ secret of my heart 풀면서 운으로 발견했는데 ㄹㅇ루다가 어리둥절 하면서 중간에 호출된 memset 과 free 를 분석해봤다. memset 은 딱히 뭔가 없었다. 문제는 바.. lclang.tistory.com 이 블로그에서 더 자세히 볼 수 있는데 심심해서 한번 되는지 함수를 gdb로 따라가 봤다. 방법은 continue를 실행해서 프로그램이 종료되거나 쉘이 실행될때, 그 함수로 들어가보는 식으로 했다. 그럼 조금만 dl__~~~~함수를 지나다보면 그 strdup()함수가 나오는데 이함수에서 malloc()을 써서 메모리를 할당하고 복사하는..