일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- master canary
- heap
- malware
- heap exploit
- RTL
- ROP
- Android
- _IO_FILE Arbitrary Address Read
- UAF
- tcache
- 나뭇잎 책
- DFB
- __environ
- _IO_FILE Arbitrary Address Write
- seccomp
- srop
- vtable
- DreamHack
- H4CKING GAME
- _IO_FILE
- Dynamic Analysis
- Reversing
- Lazenca
- BOF
- heap feng shui
- K-shield Junior
- GOT overwrite
- HackCTF
- DFC 2022
- shellcode
- Today
- Total
Studying Security
_IO_FILE Arbitrary Address Read 본문
파일 구조체를 조작해 파일을 쓰는 과정에서 임의의 메모리 값을 읽을 수 있습니다.
파일에 데이터를 쓰기 위한 함수는 대표적으로 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 |