이제 마지막으로 fclose를 분석함으로서 파일 관련 분석을 끝낼 것입니다. 이번에도 마찬가지로 #include int main(){ FILE* f = fopen("tmp", "w"); fclose(f); } 이런식으로 간단한 프로그램을 짜주시고 디버깅을 해보시면서 함수를 보시면 됩니다. 먼저 fclose도 fwrite와 fread와 비슷하게 fclose는 _IO_new_fclose의 약어입니다. int _IO_new_fclose (FILE *fp) { int status; CHECK_FILE(fp, EOF); #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) /* 우리는 필사적으로 이상한 방법으로 스트림을 사용하고, 예전과 새로운 함수를 섞은 프로그램들을 도우려고 시도한..
이번에는 fread를 분석해볼 것입니다. 저번과 마찬가지로 간단한 c 프로그램을 짜고 컴파일 후 디버깅을 하면서 함수를 보고 소스코드를 보는식으로 하겠습니다. #include int main(){ char s[100]; int f = fopen("tmp", "r"); fread(s,1,10,f); } 이런식으로 간단하게 짠다음에 디버깅을 해서 함수를 보자면 아래 그림의 과정으로 함수가 호출이 됩니다. 먼저 _IO_fread를 보겠습니다. # define CHECK_FILE(FILE, RET) do { } while (0) # define _IO_release_lock(_fp) ; } while (0) size_t _IO_fread (void *buf, size_t size, size_t count, FI..
처음에 ida를 통해 문제를 열게 되면 함수들이 sub~~어쩌구로 나오게 되는데 이것을 실행했을때 나오게 되는 선택지로 함수 이름을 복구하면 됩니다. 그래서 복구를 해보게 되면 main은 void __cdecl __noreturn main() { int v0; // eax char buf; // [esp+8h] [ebp-10h] unsigned int v2; // [esp+Ch] [ebp-Ch] v2 = __readgsdword(0x14u); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1 ) { while ( 1 ) { intro(); read(0, &buf, 4u); v0 = atoi(&buf); if ( v0 != 2 ) break; de..
저번까지 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; /* 그것의..