앞으로 나아가거나 오렌지 하우스 2단계에서
활용할 기술로 돌아가 보죠
무체중 공격이라고 하죠
네 이해하려면 말록의 내부를 더 살펴봐야 합니다
이번에는 정리가 안 된 말록과 말록의 다른 통의 관계를 더 자세히 알아보겠습니다
네 풀어 주면 여러 운명이 뒤바뀔 거예요 패스트빈에 들어갈 수 있다면 바로 그 패스트빈에
연결될 거예요 ? 네
패스트빈에 넣기엔 너무 커서 윗부분과 겹치거나 윗부분과 겹치는
것과 합쳐지면 다시 윗부분으로 합쳐져요 ? 네
네 네 정화되지 않은 부분에 연결될 수 있어요
응고된
후에요
아니면 tcache에 연결될 수 있어요 힙랩 코스에서 다룰 부분이죠
하지만 free() 함수로 직접 채워지지 않은 bin 컬렉션은 두 개 더 있습니다
네 대신 대신 말록을 부를 때 일어나는 일입니다
? 네
스몰빈과 라지빈이라고 불러요
네 네 , "아레나 레이아웃"
스몰빈은 무체중 제품 다음에 나오고 라지빈은 스몰빈 다음에 나옵니다
스몰빈은 두 가지로 연결된 무료 목록입니다
패스트빈 사이즈는 0x20부터 0x3f0까지 62개입니다
네 스몰빈은 먼저 들어가고 먼저 나갑니다
무체중 스몰빈과 비슷하지만
각각 특정 크기의 덩어리만 들어 있죠 패스트빈처럼요
라지빈 라지빈에는 두 종류가 더 있습니다 크기는 0x400 이상이지만
라지빈은 크기가 다양합니다 네 라지빈은 작동법이 좀 달라요 스킵리스트라는
걸 이용하죠 힙랩 과정
2부에서 이 부분을 다룰 거예요 ,
네 네 말록이 정리가 안 된 빈을
수색하며 요청을 처리하죠
맞습니다 네 검색되는 걸 볼 수 있어요 요청 크기가 tcache나
스몰빈 범위를 벗어나면 검색되죠 아니면 범위에 있는데 빈 칸이 나오거나요
링크를 풀면 위험하다는 거 기억하시죠? 무체중 링크는 이중으로 연결된 원형 목록으로 다양한
크기의 공짜 조각들이 들어 있어요
네 새로 분리된 덩어리를 무체중인 머리 위에 올립니다 말록이 요청하면 뒤에서
앞으로 수색하죠
네 비감시 빈에서 배분된 물건이 정확히 들어맞습니다 0x90 사이즈 청바지를 요청하면
말록이 그걸 찾아냅니다 더 큰 걸 구할 수 있더라도 0x90 사이즈 청바지만
돌려받죠
그렇군요 그런데 요청 크기와 맞지 않는 다른 덩어리를 찾다가
마주친 건 어떻게 할까요?
이 덩어리는 크거나 작은 통에 각각 분류됩니다
네 예를 들어 무체중인 덩어리는 네 개인데 사이즈는 0x100
0x90 0x400 그리고 둘
셋 0이에요
네 0x90 사이즈로 요청하면 0x90 티카빈과 스몰빈이 비었을 때 말록이
앞뒤로 비체계화된 부분을 수색할 겁니다
네 그래서 정리가 안 된 부분의 윗부분을 따라 경기장에 저장하고 목록의 마지막 부분까지 이어집니다
그 덩어리는 크기가 안 맞아요
0x90 크기가 아니라서 말록이 0x230 스몰빈으로 분류하죠
네 계속 뒤쫓습니다 방향 감각을 잃은 채로 0x400 덩어리를 발견합니다
이것도 정확히 맞지 않아서
말록이 0x400 라지빈으로 분류합니다
네 수색은 계속됩니다 정렬되지 않은 부분을 뒤지다가 이번엔 정확히
일치하는 0x90 덩어리를
발견합니다 말록이 요청을 처리하고 수색이 끝납니다
딱 맞는 규칙이
하나 있어요 나중에 다룰 건데 '마지막 남은 시간'이죠
하지만 지금은 모든 할당량이 딱 맞는다고 생각하세요
네 네 정렬되지 않은 청석을 링크를 풀어야 했습니다
네 연결 해제 위험하지만 연결 해제 기술을 사용하면서 연결 해제 기술을 사용했습니다
하지만 이 경우에는 연결 해제 기능이 필요 없습니다 연결을 해제할 때 분류된 통이
어디 있는지 알 뿐 아니라 어느 공간을 차지하는지 알기 때문이죠 링크를 끊는 과정이 능률적이라
말록이 말하는 '부분적인 링크 끊기'가 됩니다
간단해요 피해자
청크의 fd는 무시해요 항상 정서가 없는 통의 머리를 가리키거든요 항상 피해자가 마지막에
정서가 없는 통에 있으니까요
네 피해자의 bk를 따라갔고 지도가 안 된 주소는 목적지의 fd에 복사했어요 이 정도면
피해자 명단에서 제외할 수 있죠
희생자는 방향 감각을 잃은 bk 위에 복사해서 목록에서 삭제됩니다
네 정리가 안 된 부분적 언링크가 우리에게 관심을 끄는 이유는 스몰빈의 부분적
언링크와 달리 정리가 안 된 부분적 언링크는 신뢰성 검사를 받지 않기 때문입니다
적어도 글립코 버전에서는요 우리 목표는
오렌지 하우스야 여기가 혼란스러운 공격의 기본이지
설명할게요 네 부분적으로 링크를
해제하는 거예요 ,
네 원시적인 방법은 우리가 원하는 장소에 주소를 적는 거예요 그 값을 읽으면
경기장이 유출될 수 있죠 아니면 오렌지 하우스의 경우 훨씬 더 기만적인
방법입니다
네 무체계성 빈 공격을 연습할 겁니다 오렌지 하우스가
아니라 말록 시험대라는 걸 통해서요 ? 네 '멜록 테스트베드' 디렉터리를 검색해서 내용을 나열하세요
템플릿 스크립트, 바이너리 그리고 change_glibc_version이
있습니다 파이
멀록_테스트베드 바이너리를 GDB에 입력해서 보여드릴게요
생산량은 취약한 다른 쌍성과 비슷합니다 새는 곳이 있고 메뉴가 있죠
말록의 몸속은 이질성을 시험하는 데 쓰입니다 다양한 기술과 아이디어를 시험해서
실용적으로 말록의 내부를 배우죠
libc,
힙, m_array 주소를 유출하고 어떤 사이즈든 64개까지 요청할 수 있습니다
그 내용을 편집하고 데이터를 읽고 리스트할 수 있어요
벌레도 많고요
네 더블프리 덩어리도 가능합니다
심지어 무료 임의 주소도 가능합니다 'edit'과 'read' 옵션은 덩어리가 나온 후에도 사용될 수 있습니다
무료 후에 읽거나 쓰기로 알려진 버그 클래스죠 , 버그 클래스
마지막으로 'edit' 옵션에는 큰 오버플로 버그가 있습니다
네 GDB를 열고 'vmmap 커맨드'를 열면 malloc 테스트베드가 GLIBC 버전 2와 연결되어 있는 것을
볼 수 있습니다 27살요
하지만 다른 버전의 글립코를 이용해 보고 싶다면요? 글립코도 다르게 행동하고 어느
정도 정상 참작도 되니까요
네 이제 멀록의 가장 유용한 기능을 보여드리죠 글립코 스크립트 변경입니다
네 여기 나온 대로 작동해요
말로크가 쓰는 글리벡의 버전을 바꿀 수 있어요
잠시 후 오렌지 하우스와 글립벡 버전 2가 연결됩니다
23
네 그럼 테스트베드 버전을 일치시키죠 그럼
우리가 예상 못 한 감형에 걸릴 일이 없을 테니까요
네 취약한 다른 쌍성처럼 말록도 시험대에 스크립트가 들어 있습니다 스크립트를
복사해서 편집할 겁니다 무체중 공격 연습을 위해서요
네 늘 그렇듯이 스크립트는 모든 메뉴 옵션에 도우미 함수가 있습니다
나중에 자유롭게 이용하세요
'말록'과 '공짜'와 '편집' 옵션을 계속 쓸 거예요
통나무부터 정리하세요 정보와 편집 전화만 빼고 다 보관하세요
맞아요 당연하지만 가장 먼저 필요한 건 정서불안 상태의 뇌에 덩어리를 넣는
거예요
네 이 예제 스크립트가 0x90 사이즈 청크 a를 요청함으로써 그걸 설정하고 0x20
사이즈 청크를 청크 a에서 풀어줍니다
패스트빈에 넣기엔 너무 커서 정돈되지
않은 곳에 연결합니다 B는 위쪽 덩어리로 거대해지는 걸 막습니다
네 스크립트를 GDB와 NOASLR 옵션으로 실행하면 'vis'로 힙을 분석할 수 있습니다 힙의
시작 부분을 보면 혼란스러운 상태와 연결되어 있죠 '정신없는 상태'라는 명령으로 확인할 수 있습니다
"정신없는 상태"
네 방향 감각을 잃은 공격은 방향 감각을 잃은 bk를 지나치게 쓰는 것으로
시작합니다
말록의 실험대에는 이렇게 할 수 있는 벌레가 많죠
네 가장 활용하기 쉬운 건 버그 없는 버그입니다 버그가 많이 풀리면 사용자
데이터를 쓸 수 있죠
이런 버그는 프로그램이 무료 덩어리에 포인터를 제대로 처리하지 않으면 발현될 수 있습니다 예를
들면요
편집기로 돌아가서 edit() helper 함수에 호출을 추가합니다 시간이 나면 메타데이터를
덮어쓸 거예요
슬라이드를 보면 링크 일부 해제 절차를 이용해 피해자의 fd를 무시한
채 어떤 값이든 쓸 수 있어요
네 네 힙의 주소를 써서 ? 마이너스
16...
네 이렇게 하는 겁니다 청크 A가 부분적으로 연결이 끊기면 말록이 우리가 만든 bk를
따라 fd 위에 있는 무체계 빈의 주소를 복사하는 거죠 그래서 16을
빼면...
혼란스러운 공격의 결과로 혼란스러운 경기장의 주소가 첫 번째 네
글자로 기록될 것입니다
네 그 장소를 노릴 겁니다 유용해서가 아니라 일반적인 상황에서는 아무
의미 없기 때문이죠 그래야 공격이 성공했는지 쉽게 확인할 수 있으니까요
체감 못 하는 발작을 일으키려면 일부 연결이 끊겨야 해요
가장 쉬운 방법은 정리가 안 된 곳에서 바로 할당하는 겁니다 자기 크기에 맞는
덩어리를 요청해서요
네 네 할당보다는 정렬을 했으니까요 무계획 bk
공격의 부작용은 무계획
bk 위에 단조된 bk가 복제된다는 걸 기억하십시오 , 무계획 bk
말록이 피해자 조각을 분류한 후 정리가 안 된 부분을 계속 수색하면서
위조된 bk를 따라가서 목적지에 있는 조각을 현재 요청에 쓸 수 있는지
확인할 겁니다
네 그러면 일반적인 보호 문제가 발생할 수 있습니다 멀록이 지도에 표시되지 않은 기억을 읽으려
하거나 멀록이 무정체 상태 검사 중에 정신 상태를
확인하는 취약점 완화를 시도할 수도 있죠
계속 청크를 배분해서 혼란스러운 발작을 일으키죠
네 수정을 하고 나면 디버깅 옵션과 함께 스크립트를
실행하고 힙을 살펴봅니다 ,
가비지 fd가 보입니다 아무 문제도 일으키지 않았죠 지도에 표시되지 않은 메모리를
가리키지만 말입니다 이어서 위조된 bk가 나타납니다 힙이 시작되기 16 바이트를 가리키죠
그리고 네 , 경기장의 혼란스러운
장소
'print &main_arena'에서 확인 가능합니다 네 통 말록은 통에 다른 기호를
쓰지 않아 '통'이라는 큰
배열로 보관하고 마크로를 통해 접속하지
정리가 안 돼 네 '정리가 안 된 쓰레기통'의 주소죠 말록은 통을 덩어리처럼
사용합니다
16바이트 전에 '통'이 정렬되죠 우리가 혼란스럽게 공격했을 때 나온
값과 일치합니다
요약하자면 정리가 안 된 bk를 건드리고 싶다면 할당하거나 분류해서 일부만
링크를 풀면 됩니다 지도가
안 된 주소는 임의로 적으면 돼요
이 모든 과정을 무체중성 공격이라고 하죠
원시적인 물질은 양호해 보이지만 경기장 주소를 흘릴 때 유용하죠
그 경기장이 주 무대라면 libc가 유출된 거죠
하지만 오렌지 하우스에서는 다른 용도로 사용할 거예요
정서가 혼란스러운 공격은 글립코 버전 2에서 완화됐어요 28
네 정서불안 공격을 다시 보고 싶으면 강의실에서 내 스크립트를
다운로드해요
네 링크 해제에 대한 개요도 있어요 pdf에 부분적으로 링크를 해제하고 무체중
빈 공격에 대한 설명도 있어요
네 말록 시험판에는 버그가 많다는 거 잊지 마세요 어떤 버전의 글릭과도
연결될 수 있어요 23 대 2입니다 31살요, 수술 여부와 관계없이 종합해서요
네 말록의 내부를 배우고 지능을 시험할 좋은 방법이죠 솔직히
저도 메모리 할당기를 처음 배울 때 이런 게 있었으면 좋았을 거예요
좋아요 다음 영상으로 함께하시죠 오렌지 하우스의 첫 단계를 진행한 후 최종적으로
세 단계를 합칠 겁니다 ,