두 번째 기술인 패스트빈둡으로
계속하죠 복제라고도 해요 말록의 내장부터 살펴봅니다
말록이 효율적으로 하는 일은 사용하지 않는 기억을 재활용하는
거예요 말록의 두 번째 기능으로 그걸 할 수 있죠 무료로
탐색할 거예요 네 무료 또 다른 간단한 기능입니다
더는 필요 없는 곳에 포인터를 넘기면 잊어버릴
수 있죠 필요할 때 재활용될
거라는 걸 알고 있으면 안전합니다
말록의 관점에서 보면 하지만 사용하지 않는 부분이 무료 목록 중 하나로 연결되어
있어요 들리는
대로라면 무료 목록이죠 특히 저희가 관심 있는 건 패스트빈이라는
무료 목록입니다 네 빠르게요 이 목록에 있는 덩어리는 재활용이 빠르니까요 쓰레기통도요 말록
관리인들이 버킷이라고 부르는 게 아니라면 그렇게 부르거든요
패스트빈은 한 줄로 연결된 작은 컬렉션으로 특정 크기의 덩어리가
들어 있습니다
네 패스트빈의 작동 방식을 알기 위해 다른
데모 바이너리를 디버그할 거예요
fastbin_dup 디렉터리로 가서 다시 GDB에 데모 바이너리를 로드합니다
'텍텍스트 섹션 설정' 코드 명령을
다시 사용해 노이즈를 최소화하세요
메인 기능에 중단점을 설정하고 프로그램을 실행해요
네 소스 패널을 보면 이 바이너리가 가장 먼저 하는 일은 최소 크기의 청크 3개를 요청하는 겁니다
네 네 'next 3'이 그런 요청을
하죠 "nxt 3"
그리고 '시각' 명령에 따르면 더미는 우리가 예상한 그대로입니다
덩어리가 최소 세 개죠 a, b, c입니다
소스 패널을 보면 네 안 돼!
안 돼! 폭발하기 전에 '패스트빈'에
가서 확인해 보죠
네 결과에는 7개의 패스트빈이 0x20과 0x80 사이의 크기를 가지고
있는 것으로 나타났습니다
이것보다 더 많은 패스트빈이 있지만
이건 채무 불이행 상태에서 사용되는 제품입니다
각 빈의 오른쪽에 있는 null은 현재 비어있다는 것을 나타냅니다
좋아요 '다음'을 외쳐서 '비스와 패스트빈'을 풀어 줘요 뭐가 달라졌는지 보죠
네 여기 보시면 A가 0x20 패스트빈과 연결돼 있어요 말로크는 사용자 데이터가
아니라 메타데이터로 주소를 보내죠
'비스' 명령에도 같은 정보가 적혀 있습니다
근데 그 정보를 어디서 얻죠?
뭔가 바뀌었다는 확실한 증거는 없습니다
아레나로 갑니다
맞아요 경기장은 흐릿한 메타데이터를 저장하는 구조물이에요 주로 무료
목록의 상단부로 구성돼 있죠 맞습니다 네 초기 힙이 만들어집니다
이용 가능한 코어의
수에 따라 한도까지 정할 수 있죠
네 네 libc 데이터 섹션에 자리 잡죠 안 돼요
pwndbg가 현재 정보를 얻는 주요 영역이죠
네 네 'dq'를 써서 메인 아레나의 첫 20개 단어를
버릴 거예요 메인_arena
기호요
우리가 보는 걸 PDF의 레이아웃 다이어그램과 비교해 보세요
네 이건 투기장의 윗부분입니다
투기장의 윗부분 주소를 추적하죠 포스
하우스에서 간접적으로 조작한 겁니다
아직 확인 못 한 다른 통의 머리 부분이에요
이건 0x20 패스트빈의 헤드인데 현재 청크 A의 주소가 적혀 있어요
네 패스트빈 구역으로 떨어진 덩어리는 해당 구역 패스트빈 담당자에게
주소가 적혀 있습니다
네 0x30 크기의 덩어리를 풀면 주소가 여기 쓰여 있을 거예요 0x40 크기의 덩어리를 여기
기타 등등 네
이제 '다음'을 외쳐서 B 덩어리를 구하고
'비스'와 '패스트빈'을 보내죠
0x20 패스트빈에는 두 덩어리가 들어갑니다 주석이 부착된 B와 A죠 네 하지만 경기장 사이즈는 패스트빈 슬롯이
하나뿐이고 'dq'를 다시 사용함으로써
B번 청크로 자리를 차지했죠 네 네 0x20 패스트빈의 나머지 메타데이터는
인라인으로 저장됩니다 보다시피 B 청크의 사용자 데이터 첫 번째 네 글자는 포워드 포인터로 재포인팅되었습니다
fd라고도 하죠 파일 설명과 헷갈리지 않도록요 B의 fd는 A를 가리키고 a의 fd는
null이에요 목록의
끝을 의미하죠
청크 사용자 데이터는 네 ???
네
네 C는 '다음' 다음은 'vis' 'Bes' '패스트빈'과 'dq' 명령에 따르면 같은 크기의 덩어리가
나올 때마다 이 과정이 반복됩니다
네 C 덩어리는 이제 0x20 패스트빈의 첫 번째 덩어리가 됐습니다 메인 아레나의 0x20 패스트빈
슬롯에 주소가 적혀 있죠
네 네 그 결과 B가 나왔죠 , B요 b의 fd는 a를
가리키고 a의 fd는 null입니다 목록의 끝을 의미하죠
주목하세요 네 여전히 설정돼 있습니다 이전 덩어리가 사용되지 않았음에도요
패스트빈은 네 , 패스트빈이 사용되기 전
일단 지금은 아직 명확한 프리v_inuse 플래그를 기대하진 않겠습니다 무료 덩어리를
다루더라도요
네 여기 방금 일어난 일을 단순화한 시각화가 있습니다 메모리의 다른 곳에 있는
0x20 크기의 세 개의 덩어리로요
청크 A가 해방되자 fd는 null이 됐고 주소가 메인 아레나의 0x20 패스트빈 슬롯에
기록됐습니다
그리고 청크 B는 풀려났습니다
fd는 포인터를 청크 A로 옮겼고 청크 B의 주소는 0x20 패스트빈 슬롯에 적혀 있었습니다
네 마침내 청크 c가 풀려나자 fd는 포인터를 이용해 청크 B를 입력했고 청크 C의 주소는 0x20 패스트빈 슬롯에
적혀 있었습니다 ????
패스트빈을 시각화할 또 다른 방법은 저장소 모음을 이용하는 겁니다 아레나에서 열릴
스택 포인터를요
예를 들어 0x20 크기의 덩어리가 풀릴 때마다 0x20 스택의 상단에 추가됩니다
네 스택 비유가 적절합니다 패스트빈은 맨 마지막에 맨 앞에 있거나 LIFO
구조물이라 다음번에 0x20을 요청하면 터지거나 맨 위에 배정된다는
뜻이죠
확인합니다 '다음 3' 명령을 발령해 확인할 수 있습니다 3은 최소 크기의 청동에 대한
3개의 추가 요청을 실행하고 d, d, d라고 E와 F가 한 자리
네 'd'를 출력하고 'e'와 'f'를 출력해서 말로크가 마지막 몫을 할당했는지
확인하죠 c b a를 추가하면 0x20 패스트빈 스택의 상단에 배치할 수 있어요 상단의
메모리를 더 쓰지 않고요 ?
퀵빈은 그렇게 작동해요
네 요약하자면 일렬로 연결된 비원형 무료 목록입니다 기본 조건으로 0x20부터
0x80까지 특정 크기의 무료 덩어리가 들어 있죠 ?
가장 늦게 들어오고 가장 나중에 나가죠 쌓은 것처럼 작동해요
네 패스트빈의 상사가 경기장에 자리하고 패스트빈의 남은 링크는
일렬로 힙에 저장됩니다
네 요청이 들어오면 패스트빈 크기라면 말록은 적절한 패스트빈을 찾아
맨 위부터 배설합니다 네, 맞아요
네 패스트빈에 대한 지식을 보충하고
싶다면 PDF의 '아레나스' 섹션에 있는 '패스트빈'을 보세요
네 '말록 서행 차트'를 확인하세요
할당 시 어느 통을 수색하는지 알고 싶다면요
네 이제 패스트빈을 잘 이해했으니 두 번째 쌍성을 살펴보죠
패스트빈 둡 기술을 배울 거예요