이 영상에서는 로어의 집을 활용해서 가짜 토스트를 스몰빈에 연결하는 법을 배워 볼 거예요
시작하기 전에 말록의 스몰빈에 대해 자세히 알아보죠
정서가 혼란스러운 것과 마찬가지로 각 작은 빈은 두 개로 연결되어 있고 덩어리가 동그랗게 나 있습니다
스몰빈의 네 첫 2개 쿼드는 프리 청크 유저 데이터에서
인라인으로 유지됩니다
네 무체중 빈과 달리 각 스몰빈에는 특정 크기의 덩어리만 담깁니다 0x20부터 0x3f0까지요
패스트빈 범위가 겹치죠
예를 들어 0x20 스몰빈은 0x20 사이즈밖에 안 들어가잖아요
0x200 크기의 스몰빈에는 0x200 크기의 덩어리가 들어가요
네 스몰빈으로 얼마나 빨리 가는지 궁금하시다면 패스트빈에서 무정체빈으로
덩어리를 옮길 수 있어요 말로크 통일이라는 기능을 통해서요 다른 기법으로 다룰 거예요
네 스몰빈은 선착순으로 운영됩니다 정리가 안 된 스몰빈으로 분류된 덩어리는
목록 앞부분에 연결되고 스몰빈으로 할당된 덩어리는 목록 뒷부분에
있습니다 ?
스몰빈스 기억이 잘 안 나면 '아레나스' 섹션 아래의 '스몰빈스'
헤더로 검색하세요
네 '아레나스' 아래에는 아레나 배치도그램이 있는데 작은 빈의 머리가 아레나에
자리하는 걸 보여주죠
네 네 가짜 덩어리를 하나로 연결하려면 혼란스러운 통을 상대로
했던 것과 같은 작업을 해야 합니다 공짜 덩어리의 포인터를 덮어쓰는 거죠
정리가 안 된 로어의 집을 복사하세요 제자리에 놓거나 편집하세요 아니면 제가 이전 비디오에서 언급한
주석이 있는 개발 스크립트를 이용해 작업하셔도 됩니다
네 착취 대상은 대부분 같겠지만 우선 피해자 청크를 스몰빈으로 분류해야
해요 그래야 무삭제 버그를 활용해서 정돈되지 않은 스몰빈 메타데이터를 조작할
수 있죠 ?
첫 번째 첫 번째 덩어리를 풀어준 후 말로크를 호출합니다 첫 번째보다
큰 덩어리를 요청합니다 같은 크기 혹은 그 이하를 요청하면 청크 A는 할당되거나 나머지 할당이 됩니다
요구 사항이 많으면 A를 적당한 스몰빈에 분류해야 합니다
제 경우에는 A 덩어리가 0xb0 크기니까 0xb0 크기의 덩어리를 요청할게요
네 상황을 파악하는 동안 나머지 공격에 대해 설명하세요 gdb와 noaslr 옵션으로
스크립트를 실행하세요 ,
컨트롤+c로 GDB를 입력합니다 그런 다음 'vis' 명령으로 힙을 검사합니다
이 더미에는 세 개의 덩어리가 있고 처음 두 개는 각각 A와 B입니다
세 번째는 맨 위에 할당된 겁니다 우리가 마지막으로 분류된 A를 요청했을 때요
네 네 주석을 달았습니다 '스몰빈'에 확인하면
됩니다
네 사용자 데이터의 첫 4개 단어는 스몰빈으로 용도가
바뀌었습니다 앞 뒤 포인터죠 네 네 이제 청크 B의 영역입니다
안 됩니다,
네 네 이 가짜 덩어리를 0xa0 스몰빈에 연결하려면 그 후 쓰기 버그를 이용해서
가짜 덩어리의 주소로 포인터를 덮어쓰면 돼
GDB를 닫고 편집기로 돌아가죠
좋아요, 그럼 bk를 더럽힌 선부터 제거하세요 수정할 필요 없어요 스몰빈의
할당은 무체중인 선과 부분적으로 연결을 끊거든요
그럼 fd는 무시하고 위조 bk만 주면 되겠네요
네 가짜 덩어리의 크기를 바꿔야 한다고 생각하실 수도 있지만 사실 그렇지 않습니다
스몰빈에서 제공하는 용량에는 안전성 검사가 없습니다
가짜 덩어리를 0으로 설정할게요 제약 조건이 하나 줄죠 로어 가문의 변종이죠
다음 호출 주석을 해제하세요
네 우리가 요청한 메모리 용량을 변경해야 해요 우리가 조작하는 스몰빈에 맞추려면요
제 경우에는 0xa0 크기의 청크를 요청해야 해요 0x98바이트의 사용자 데이터죠
네 무체중으로 할 때처럼 바로 할 수는 없어요 각 스몰빈은 같은 크기의
덩어리를 담고 먼저 넣어야 해요
0x0 크기로 두 번 요청해야 해요
첫 번째 덩어리는 A에 놓고 두 번째 덩어리는 가짜 덩어리를 놓죠
수정을 하고 나면 일반적인 옵션으로 스크립트를 실행합니다
네 안타깝게도 저는 말로크 프린터의 존재를 보면 알 수 있듯이 백추적 패널에서
말로크의 착취 완화를 촉발했어
어떤 건지 알아내려면 _int_malloc (#프레임에서 '컨텍스트 코드' 명령을 사용합니다
이건 오해의 소지가 있어요 우리가 패스트빈 관련 완화를 촉발했다고 생각할 수도 있어요
하지만 맬록_프린터러로 바꾸면 프레임 자체에 전달된 오류 줄이 이렇게
쓰여 있죠 '스몰빈 이중 링크 목록 손상'
이 암호로 전화를 걸었어요
'고토 에라우트'라는 줄에 이 라벨이 부합하죠
네 우리가 떨어뜨리는 건 이거예요 안전 연결 해제 수표의 반쪽이죠 ? 네, 맞아요
BK를 따라가면서 목적지에 있는 fd가 BK를 가리키는지 확인합니다
물론 청크 A는 가짜 청크를 가리키죠 그 fd는 null이에요
우리는 하나의 완화를 다른 것으로 바꾼 거죠
이 문제를 해결하려면 유출이 많이 필요한데 다행히 이 바이너리가 이미 제공해줬죠
편집자 앞으로 돌아가세요
사용자 이름의 3번째 쿼드를 수정해야 해요 fake 청크의 fd를 형성하는 거죠
네 a 덩어리를 가리켜야 해요 가장 먼저 보이는 덩어리죠 그러니 '힙' 변수를 쓰면 돼요 ? 네
이 프로그램의 힙 시작 주소를 갖고 있죠
'떨기' 변수는 프로그램 시작 시 누출이 원인입니다
네 물론 물론
?
네 가짜 청크는 이미 bk로 표시해뒀어요 일부 링크가 풀렸을 때 세그파울을
피하려고요 가짜 청크의 주소가 있는 곳을 가리키는 곳에 fd를 설치해야 해요
가짜 코멘트에 포인터를 추가했습니다 맬록에 마지막 두 통화에서요 도우미
기능이죠 마지막 요청을 하기 전에 메모리의 가짜 청크를 확인할 수 있도록요
좋아요, GDB와 NOASLR 옵션으로 취약점 스크립트를 실행하세요 ctrl+c로 브레이크하고
'dq & 사용자'로 작업한 걸 살펴보죠
Fake 청크는 유효한 크기 필드가 없지만 문제가 안 될 걸 압니다
이 정도면 1등급은 되겠군요
우리가 가짜 덩어리를 가리키도록 건드렸다는 걸 기억하세요
그럼... 네 ?
네
네 네 그 장소에 fd를 제공해 가짜 청크를 가리킵니다
할당 시 부분 언링크 수표를 충족시킬 수 있죠 ,
이제
이제 출발해도 되겠어요
편집기로 돌아가 마지막
3줄 주석을 해제할게요
네 첫 번째는 0xa0 스몰빈의 A를 요청하고 두 번째는 같은 스몰빈의 가짜 덩어리를 요청하고 세 번째는
하우스 오브 로어의 무정체빈 변이에서 했던 일을 그대로 합니다 가짜 덩어리를 편집하고
타깃 데이터를 덮어쓰는 거죠 ?
그럼 생산 조건에서 착취를 실행해서 모든 게 제대로 작동하는지 확인해 보죠 이번에는요
옵션 4를 이용해 대상을 프린트합니다
네 네 성공적으로 바뀌었다는 걸 보여줍니다
요약하자면 버그를 활용해서 스몰빈에 있는 무료 b를 덮어썼다는
거죠 , 버그의 b는 다른 곳에 준비해둔 가짜 조각의 주소를 덧붙였죠
네 네 , 가짜 살점이 살점을 가리키도록요
일부 금고를 끊은 건 만족스러웠어요
그 스몰빈에서 가짜 덩어리를 할당해 임의로 썼어요
이걸 하려면 가짜 덩어리가 부분적으로 안전하지 않은 연결을 끊는 수표를 통과해야
하는데 가짜 덩어리의 bk를 fd가 있는 곳에 둬서 관리해야 합니다 가짜 조각을 가리키죠
네 스몰빈에서 나온 공간은 크기 보전 확인을 안 해서 가짜 크기를 제공할 필요가
없었어요
네 로어 하우스의 무정렬 변종처럼 잘못 정렬된 가짜를 쓸 수도 있고
가짜를 여러 개 연결할 수도 있어요 ? 네
네 가짜 크기 필드는 필요 없지만 스몰빈 하우스 오브 로어는 정서불안
변종보다 제약이 더 강합니다
메모리를 더 잘 통제하고 유출도
많이 해야 해요
스몰빈 하우스 로어 변종을 다시 보고 싶으시면 제 강의 리소스에서 주석형 솔루션
스크립트를 다운로드하세요
그리고 물론 PDF 파일에는 로어 가문의 개요가 담겨 있어요 말록 내부도요 지금까지는
다 살펴봤어요
다음 영상에서는 라지빈스 구전집 활용법을 배워보겠습니다
거기서 봐요