네 이번 영상에서는 파일 스트림 착취에 대해 알아보겠습니다 파일 스트림이 무엇이냐는 질문에
대한 답부터 하겠습니다 네 Linux 파일에 엑세스
권한을 요청할 때 프로세스는 파일 설명과 함께 발급됩니다 줄여서 fd죠 지금까지 우리가 다룬 포워드
포인터 fd와 헷갈리지 마세요 , 파일 설명은 프로세스가 리소스를
처리하는 데 사용할 수 있는 양수입니다
하지만 파일 설명을 통해 파일을 처리하는 건 번거로울 수
있습니다 읽고 쓸 수는 있지만 파일을 처리하는 방식은 좀 더 미묘하죠
그때 글리벡의 파일 스트림이 나오죠 네 파일 설명의 일부로 삶의 기능에
품질을 제공하는 래퍼죠 버퍼된 i/o나 실행
취소 같은 거요 예를 들면요 네 네 fopen 같은 함수는
리턴 포인터입니다
_IO_FILECT를 볼게요
소스 코드를 검색하지 않고 글립브 스트럭츠를 빠르게 조사하는 한 가지 방법은 GDB를 이용하는 겁니다
네 GDB에 이진법을 넣으면 누구나 할 수 있어요 친구/bin/sh를 골라서
라이브러리를 확실히 로딩하도록 '시작' 명령을 내릴게요
'ptype' 명령으로 글리벡 타입을 조사할 수 있어요
그럼 네 스트럭츠를 조사할 때 '스트럭츠'
키워드를 꼭 써 "스트럭츠"
이 경우 _IO_FILECT는 파일 형식으로 되어 있어서
이 명령을 짧게 할 수 있습니다
네 pwndbg는 'ddt'나 '덤프 타입' 명령을 이용해 커맨드를 더 짧게 할 수 있습니다 더 깔끔한 출력을
제공하죠
네 명심하세요 녹화할 때 'dt' 명령에 따라 빈칸이 있으면 따옴표를
붙여야 합니다 ? 네? 예를 들어 dt 'struct_IO_FILE'
말씀드렸듯이 _IO_FILEText는 파일 설명자를 감싸는 래퍼입니다
'문의 내용은 '_필레노' 멤버에 있습니다'
그리고 파일 스트림은 주로 문자 버퍼로 구성되는데 버퍼된 i/o
같은
기능을
지원하기 위해 사용됩니다 이 과정에서 흥미로울 다른 영역도 간단히 다룰
겁니다
네 시작 부분에 '_flags' 멤버가 있어요 파일 스트림 상태를 결정하죠
네 '_chain' 멤버도
있어요 다른 _IO_FILE 구조 포인터임을 나타내죠 , 다른 _IO_FILE 구조요 이 _체인 멤버들이
하나로 연결되어 모든 오픈 파일 스트림의 비순환적 목록을 만듭니다
그 리스트의 맨 위에 'IO_list_all'이라는 기호가 있어요
네 fopen 같은 함수로 새 파일을 열 때마다 () an_IO_FILE 구조가 힙에 생성되어 _IO_list_all
list의 상단에 연결됩니다 파일의 패스트빈 같은
거죠
네 네 나중에 유용성이 밝혀질
겁니다 ,
우선 _IO_List_all로 돌아가서
타입은 _IO_FILE_plus입니다
글립코드를 글립코드라고 하려면 약간의 간접적인 표현이 필요하죠 _IO_FILE_plus
구조는 _IO_FILE 구조의 래퍼로 vtable 포인터를 추가합니다 'dt' 명령의
결과물을 볼 수 있죠
어떤 형태인지 어떻게 작동하는지 알면 다음 단계는 건너뛰어도 돼요
네 네 c++ 같은 개체 지향 언어에 다형성을 구현하는 방법 중
하나입니다 익숙해지기 위해 예시를 들어 볼게요 , 좋아요
'카'라는 클래스가 있다고 해보죠 가속을 가능하게 하는 기능이 있어요 네 그래서 스코다나 페라리 같은 차들에서
좀 더 많은 클래스를 끌어낼 때 그 차들을 다른 속도로 가속시켜 줬으면 좋겠어요
그래서 가속을 일명 '가상' 기능을 만듭니다 스코다와 페라리가 자체 발효로 재정의할
수 있다는 뜻이죠
네 차의 가속 방법이 자동차 물체에서 직접 호출되면 호출은
적절한 가속 버전으로 바로 갈 수 있습니다
하지만 어떤 종류의 자동차든 주장으로 삼는 기능을 가속이라고 합니다
네 이 함수는 스코다를 호출할 수 있습니다 () 메서드 또는 페라리요 컴파일러는 런타임에
어떤 종류의 차가 수신될지 알 방법이 없습니다
네 이걸 다형성이라고 합니다 C++ 같은 언어는 어떻게 사용해야 할지 명시하지 않지만 한
가지 해결책은 vtable입니다
약간 단순화하고 있지만 기본 원리는 가상 함수를 사용하는 클래스를 vtable로
만드는 겁니다
네 네 ? 네
예를 들어 스코다와 페라리는 이런 형태가 될 수 있어요
네 네 스코다 vtable의 세 번째 참가자는 스코다
가속의 주소를 가지고 있습니다
스코다나 페라리 제품에도 활성화 포인터를 달아요
좋아요 그럼 아까 말한 기능은 자동차의 정확한 버전을
가속화해야
합니다 물체의 활성화를 따라
세 번째 항목을
활성화하면 되죠
C++ 쌍성을 이용해 봤다면 가상 납치도 연습했을 거예요
모르는 분들을 위해 설명하자면 지속 가능한 공중 납치란 물체의 지속
가능한 포인터에 오버플로 같은 걸 써서
조작할 가짜를 가리키는 겁니다
좋아요 이 시나리오에서 가짜 영상의 세 번째 항목을 전자 기기 주소에 설정할 수 있어요
, 이 물체의 가속 기능이 다음에 호출되면 껍데기를 갖게 됩니다
네 vtables가 C++ 같은 오브젝트 지향 언어에 사용된다면 무엇을 하는 걸까요?
첨부 파일 누 C 도서관의 스트럭츠
네 그럼 그누와 C++ 라이브러리는 밀접하게 연결돼 있는데요
리눅스에서 C++ 프로그램을 디버그하면 C++ 표준 라이브러리 외에도 c 표준 라이브러리가 로드된
걸 볼 수 있습니다
네 그 이유는 누 C++ 라이브러리가 하위
기능을 사용하기 때문입니다
다시 씌우는 게 아니라요 가령 C++ 프로그램을 디버그해 파일을 열고 중단점을 설정할 경우 C
library fopen()
함수에요 C++ standard 라이브러리가 C standard 라이브러리를 호출한 게 보이죠 하위 수준 파일 작업을 수행하기
위해서요
그렇습니다 이것도 C++ 방식입니다 Make_shared와 Unique을 만드는 방식도 마찬가지죠 둘 다 C library의 말로크
기능을 이용합니다
네 _IO_FILE_plus 스트럭츠의 경우 vt 가능한 포인터를 받습니다 C++스트림부프 클래스와
호환될 수 있도록요
이유가 뭐든 이로써 글립벡의 파일 스트림은 vt 가능한 하이재킹에 취약해집니다 파일 스트림 착취의
형태죠 오렌지 셸 하우스를 얻는 데 이 방법을 사용할 겁니다 ?
그렇습니다 파일 스트림은 중요한 타깃입니다
새로운 파일 스트림은 힙에 생성되었기 때문에 지금까지 활용한 오버플로나
더블-프리 같은 다양한 힙 버그 클래스에 취약할 수 있습니다
하지만 새 파일을 열 때만 공격해도 될까요?
안 돼요
네 네 스트딘, 스트드아웃, 스트더 이 둘을 합쳐서 표준 I/O
파일 스트림이라고 하죠 , 이 파일 스트림으로
네 네 표준 I/O 파일
스트림이 있을 겁니다
gui를 사용하는 더 복잡한 프로그램도 마찬가지입니다
예로 Firefox를 사용하겠습니다 Ubuntu Linux가 설치되어 있으니까요
GDB를 Firefox에
첨부하고 _IO_all list의 상단에 값을 출력합니다 stderr이 마지막으로 열렸던
파일임을 보여줍니다
stderr 파일 스트림을 나타냅니다 네 파일 스트림을 따라가면 '스타우트
파일 스트림'과 스타딘 파일 스트림이 나와요 거기서 체인이 끝나죠
네 신포 명령에 따르면 'IO_FILE_plusStout'은 글립코
데이터 섹션에 있습니다 스타인, 스타더와 함께요
네 따라서 이진법이 파일을 열거나 표준 I/O 파일 스트림을 사용하지 않아도 파일
스트림 착취를 활용할 수 있습니다
그게 하우스 오브 오렌지의 3단계예요
파일 스트림의 포인터를 망가뜨리거나 가짜 파일 스트림을 삽입할 거예요
네 그리고 스트림 멤버의 기능 중 하나가 실행으로 전환되면 가짜 vtable을
통해 리디렉션되고 임의로 코드 실행이 가능합니다
좋아요, 다음 영상으로 오렌지 하우스의 두 번째 단계인 방향 감각을 잃은 공격에 대해 배워보죠
안목 없는 공격