2025. 6. 13. 15:53ㆍ모의해킹 관련 레퍼런스 및 실습/보안-시스템해킹(Pwnable)
[原创] House of apple 一种新的glibc中IO攻击方法 (1)-Pwn-看雪-安全社区|安全招聘|kanxue.com
원문이 중국 레퍼런스다... 번역된 한국어 게시글이 있는진 모르겠다. 외부 스터디에서 공부하다가 받은 자료인데 셀프 공부용으로 정리한 거 다시 한 번 정리하려고 한다. PoC를 직접 뜯어보는 것도 좋지만 보면 알겠지만 PoC가 잠겨있다... 그래서 아쉽지만 개념 위주로 찾아봤다.
(논문은 아닌데 오픈소스 레퍼런스..)
glibc 상위 버전에서 hook 전역 변수가 제거됨에 따라 도입된 기법
-> 성공적으로 hook 전역 변수를 사용하기 위해선 IO_FILE(리눅스 시스템의 표준 라이브러리에서 파일 스트림을 나타내기 위한 struct(구조체)로 파일을 열기 위한 fopen 함수를 사용할 때 heap 영역에 할당됨) 구조체를 구축하고 흐름을 공격해야한다.
house of apple 1 사용 조건
- 프로그램이 main 함수에서 return 되거나 exit 함수를 호출
- heap 주소와 libc 주소를 호출
- largebin attack 한 번 사용 가능(한 번이면 충분함!)
참고로, house of pig는 IO_FILE struct 외에 tcache_perthread _struct를 가로채거나 임의의 주소 할당을 제어한다.
또한, house of kiwi는 (_IO_helper_jumps + 0xA0) + (_IO_helper_jumps + 0xA8) 의 최소 세 곳의 값을 수정
+) fclose() 함수란?
- 하나의 스트림을 닫는다.
+) fcloseall() 함수란?
- 모든 스트림을 닫는다.
+) vtable이란?
- Virtual Function Table의 약자로, 상속 구조에서 method 를 virtual 로 선언하면 vtable이 생성된다. 특수한 memory 영역을 활용해 알맞은 코드를 호출하고, 메소드가 하나 이상 정의된 클래스마다 vtable은 하나씩 구현되어있다. 따라서 vtable을 가진 클래스를 생성한 객체마다 이 vtable에 대한 포인터를 가짐.
- 상속 구조에서 동적 바인딩(dynamic binding)이라는 중요한 특성을 가진다.
-> 동적 바인딩이란(Dynamic binding)?
-> 실행 시간(runtime)에 성격이 결정되는 것으로 인터프리터 언어인 파이썬 런타임 값에 따라 변수의 데이터 타입이 결정되고, 런타임에 자유롭게 성격이 바뀌므로 적응성이 높아진다.
- 가상 함수를 사용하고 실행 파일을 만들때 binding 되지 않고 보류 상태에 둔다. jump할 메모리 번지를 저장하기 위한 메모리 공간(4 byte)를 가지고 있다가 runtime이 결정된다.
- 단점으로는 type checking(형식이 일치하는지 아닌지)으로 인한 수행 속도가 저하되고 메모리 공간의 낭비가 발생해 가급적 정적 binding을 사용한다. 그럼에도 불구하고 동적 binding을 하는 이유는 어떤 포인터에 의해 접근되었는지에 상관없이 참조된 인스턴스의 실제 class 행에 따라 재정의된 함수 호출이 가능

fp -> _wide_data -> _IO_buf_base로 판단한다.(_IO_write_base, _IO_read_base, _IO_read_ptr, _IO_read_end로 이루어져 있다.)
snf -> overflow_buf 또는 해당 주소와 일정 범위 내에서 offset된 값을 부여한다.
fp -> _wide_data를 제어하는 한 fp->_wide_data부터 일정 범위 내의 메모리 값을 제어할 수 있고, 알려진 주소를 쓰는 모든 주소와 동일하다.(단순하게 말해서 함수의 고윳값이 존재하고 변하지 않는다!)
대형 chunk를 free하고 pointer_guard(포인터로 특정 주소에 접근하는 걸 막는 함수) 또는 tcache 변수를 덮는다.(house of apple + house of corrison 이 두 기법을 혼합한 것이다.)
예를 들어, main_arena를 납치할 수도 있지만, 이 struct 더 복잡하고 필요한 공간이 더 커짐
_IO_file struct(구조체)를 선택할 수 있으며, 핵심 필드가 요구사항을 충족하는지 확인하기만 하면 되므로 공간을 더 절약할 수 있다. (glibc 버전은 2.34이고, chunk의 크기는 기본적으로 고정되어 있고(최대 0x10회만 할당할 수 있다.), 읽기/쓰기 1회만 허용된다.)
참고 문헌
https://guru.tistory.com/125
Vtable - 어디에 존재하는가..
0. Vtable 이란 vtable 이란, Virtual Function Table의 약자로, 상속 구조에서 메서드를 virtual로 선언하게 되면, vtable이 생성되게 됩니다. vtable(가상 테이블)은 특수한 메모리 영역을 활용하여 알맞은 코드
guru.tistory.com
https://secretroute.tistory.com/entry/140819
정적 바인딩(Static binding) vs. 동적 바인딩(Dynamic binding)
* Binding - 프로그램 구성 요소의 성격을 결정해주는 것ex ) 변수의 데이터 타입이 무엇인지 정해지는 것 종류정적 바인딩(Static binding) 동적 바인딩(Dynamic binding) 정의 컴파일 시간에 성격이 결정되
secretroute.tistory.com
'모의해킹 관련 레퍼런스 및 실습 > 보안-시스템해킹(Pwnable)' 카테고리의 다른 글
[포너블] 달고나 문서(buffer overflow) 리뷰 (0) | 2025.05.19 |
---|