2019/09/12 - [힙(heap)/house_of_orange] - house_of_orange 번외 - fopen함수 분석(glibc 2.23) 2019/09/13 - [힙(heap)/house_of_orange] - house_of_orange 번외 fread 분석 (glibc 2.23) 2019/09/13 - [힙(heap)/house_of_orange] - house_of_orange 번외 - fwrite 분석 2019/09/13 - [힙(heap)/house_of_orange] - house_of_orange 번외 - fclose 분석 이렇게 파일 관련 함수들을 분석을 해보았는데 이번에는 이것을 바탕으로 FSOP라는 공격기법을 사용해볼 것입니다. 문제는 pwnable.tw의 seethefi..
이 문제파일은 strip되어 함수 심볼같은 것들이 다 날라가 있다. 그래서 실행했을 때의 모습과 문자열을 통해 함수들을 복구해내어야 한다. 그런데 ida의 디컴파일 기능으로도 제대로 복구가 안되기 때문에 어셈블리어도 함께 보아야한다. 이렇게 어셈블리어로 보면 보다 정확하게 어떤 함수가 어떤 인자로 호출되는지 알 수 있다. 1. fp = fopen("top_secret", "r"); 파일을 열고 그 파일 디스크립터를 bss에 있는 변수에 저장해둔다. 2. scanf("%s", &scanf_buffer); 를 실행하는데 저 scanf_buffer는 bss의 주소에 있다. 즉 우리는 bss에서 bof를 일으킬 수 있는 것이다. 3. read(fp, buffer, 0x12c); fp를 이용해 입력을 받는다는 것..
이제 마지막으로 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) /* 우리는 필사적으로 이상한 방법으로 스트림을 사용하고, 예전과 새로운 함수를 섞은 프로그램들을 도우려고 시도한..
2019/09/13 - [힙(heap)/house_of_orange] - house_of_orange 번외 fread 분석 (glibc 2.23) 저번에는 fread에 대해 분석을 해보았는데 이제는 fwrite에 대해 분석을 진행해 볼 것입니다. #include int main(){ char s[100] = "test_test_test_test"; int f = fopen("tmp", "w"); fwrite(s,1,9,f); } 이런식으로 간단한 프로그램을 짜주시고 컴파일 후 디버깅을 이용해 함수를 보시면 됩니다. fwrite는 iofwrite랑 같습니다. 즉 iofwrite를 분석하면 fwrite를 분석하는 것입니다. _IO_size_t _IO_fwrite (const void *buf, _IO_siz..
이번에는 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..
house_of_orange라는 것도 FSOP라는 공격기법 중 하나입니다. 그래서 이번엔는 house of orange 심화로 FILE과 관련된 구조체, 함수들에 대해 정리를 해보고 익스플로잇(FSOP)을 해보도록 하겠습니다. 먼저 파일 디스크립터를 다룰때 가장 많이 나오는 foen함수를 보도록 하겠습니다. fopen 함수를 아래처럼 코딩한 후 gdb를 통해 fopen() 함수의 흐름을 보자면 #include int main(){ int f = fopen("tmp", "r"); } 이런식으로 호출이 된다는 것을 알 수 있습니다. __fopen_internal 부터 보도록합시다. typedef struct { int lock; int cnt; void *owner; } _IO_lock_t; //stdio-..
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를 잘 조정..
처음에 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..