Studying Security

_IO_FILE Arbitrary Address Read 본문

개념 정리/_IO_FILE

_IO_FILE Arbitrary Address Read

J4guar 2022. 5. 12. 15:04
728x90
반응형

파일 구조체를 조작해 파일을 쓰는 과정에서 임의의 메모리 값을 읽을 수 있습니다.

파일에 데이터를 쓰기 위한 함수는 대표적으로 fwrite, fputs가 있습니다.

해당 함수는 라이브러리 내부에서 _IO_sputn 함수를 호출합니다. 

_IO_XSPUTN 함수의 매크로이며 실질적으로 _IO_new_file_xsputn 함수를 실행합니다.

이 함수에서는 파일 함수로 전달된 인자인 데이터와 길이를 검사하고 _IO_OVERFLOW, 즉 _IO_new_file_overflow 함수를 호출합니다.

 

실제로 파일에 내용을 쓰는 과정은 _IO_new_file_overflow를 시작으로 다양한 함수가 호출되면서 이뤄집니다.

그렇다면 _IO_new_file_overflow 함수 내부에서 어떻게 파일에 데이터를 쓰는지 자세하게 알아보겠습니다.

쓰기 권한이 존재하는지 확인

ch가 EOF라면 _IO_do_write함수를 호출하게 되는데

_IO_OVERFLOW를 호출할 당시에 EOF를 인자로 전달하므로 _IO_do_write함수가 호출됩니다.

_IO_do_write함수는 new_do_write함수를 호출합니다.

new_do_write를 살펴보면

_IO_IS_APPENDING flag 검사

_IO_SYSWRITE 호출 => _IO_SYSWRITE( fp, data, to_do)

이는 곧 vtable의 _IO_new_file_write함수입니다.

_IO_new_file_write는 함수 내부에서는 write 시스템 콜을 사용해 파일에 데이터를 작성합니다.

__write(f->_fileno, data, to_do);

파일 구조체 조작

fwrite 함수에서 참조하는 파일 구조체를 조작해 target_buf의 내용을 획득하는 것입니다.

  • 임의 주소의 값을 읽기 위해서는 먼저 _flags 변수를 파일 쓰기에 있어 필요한 권한으로 변경합니다.
    • 필요한 권한은 _IO_IS_APPENDING으로, _flags 변수를 매직 값(0xfbad0000) | 0x800을 포함한 값으로 변경
  • 임의 주소의 값을 읽기 위해 _IO_write_ptr과 _IO_write_base를 변경합니다.
    • _IO_write_base를 target_buf의 주소로 조작하고, _IO_write_ptr을 target_buf 주소에 size를 더한 값으로 변경합니다.
  • 출력하게끔 하기 위해 fileno 즉, 파일 디스크립터를 stdout을 나타내는 1로 덮어쓰면 됩니다.
write(f->_fileno, _IO_write_base, _IO_write_ptr - _IO_write_base);

Reference

 

해커들의 놀이터, Dreamhack

해킹과 보안에 대한 공부를 하고 싶은 학생, 안전한 코드를 작성하고 싶은 개발자, 보안 지식과 실력을 업그레이드 시키고 싶은 보안 전문가까지 함께 공부하고 연습하며 지식을 나누고 실력 향

dreamhack.io

 

반응형

'개념 정리 > _IO_FILE' 카테고리의 다른 글

_IO_FILE vtable  (0) 2022.05.13
_IO_FILE Arbitrary Address Write  (0) 2022.05.12
_IO_FILE  (0) 2022.05.11
Comments