728x90
반응형
원리
기본적인 내용은 앞선 FSOP 들과 동일하며,
_IO_FILE 구조체가 아닌 vtable 구조체의 값을 사용하는 함수이다.
_IO_flush_all_lockp() 함수의 실행 조건은 아래와 같다.
- 라이브러리가 중단된 프로세스를 실행할 때
- exit 함수를 호출할 때
- main 함수에서 return으로 종료될 때
취약점
우선 해당 함수를 조금 뜯어보자.
아래는 _IO_flush_all_lockp() 함수의 코드이다.
int
_IO_flush_all_lockp (int do_lock)
{
int result = 0;
struct _IO_FILE *fp;
int last_stamp;
#ifdef _IO_MTSAFE_IO
__libc_cleanup_region_start (do_lock, flush_cleanup, NULL);
if (do_lock)
_IO_lock_lock (list_all_lock);
#endif
last_stamp = _IO_list_all_stamp;
fp = (_IO_FILE *) _IO_list_all;
while (fp != NULL)
{
run_fp = fp;
if (do_lock)
_IO_flockfile (fp);
if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
|| (_IO_vtable_offset (fp) == 0
&& fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr
> fp->_wide_data->_IO_write_base))
#endif
)
&& _IO_OVERFLOW (fp, EOF) == EOF)
result = EOF;
if (do_lock)
_IO_funlockfile (fp);
run_fp = NULL;
if (last_stamp != _IO_list_all_stamp)
{
/* Something was added to the list. Start all over again. */
fp = (_IO_FILE *) _IO_list_all;
last_stamp = _IO_list_all_stamp;
}
else
fp = fp->_chain;
}
여기서 중요한 함수는 _IO_OVERFLOW이며, fp와 EOF를 전달 받는다.
이 함수를 다시 보면 아래와 같이 정의되어 있고 _IO_FILE 구조체를 사용함을 알 수 있다.
typedef int (*_IO_overflow_t) (_IO_FILE *, int);
#define _IO_OVERFLOW(FP, CH) JUMP1 (__overflow, FP, CH)
#define _IO_WOVERFLOW(FP, CH) WJUMP1 (__overflow, FP, CH)
마찬가지로 해당 함수는 몇가지 조건이 있는데 요약해보면 아래와 같고
if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
|| (_IO_vtable_offset (fp) == 0
&& fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr
> fp->_wide_data->_IO_write_base))
#endif
)
&& _IO_OVERFLOW (fp, EOF) == EOF)
가운데 or 조건이 있기에 앞의
_mode <= 0
_IO_write_ptr > _IO_write_base
조건만 만족하면 다음 and 조건을 확인하기 위해 _IO_OVERFLOW 함수를 실행한다.
728x90
반응형
'Tips & theory' 카테고리의 다른 글
system hacking을 register 기초 (0) | 2022.09.05 |
---|---|
_IO_FILE_plus의 모든 것. (0) | 2022.08.21 |
Bypass IO_validate_vtable (0) | 2022.08.17 |
_IO_FILE Arbitrary Address Write (0) | 2022.08.16 |
_IO_FILE Arbitrary Address Read (0) | 2022.08.16 |