두 번째 기술은 로레의 집이라고 하는데 말록말레피카룸에서 유래한 기술이죠
가짜 덩어리를 스몰빈이나 라지빈에 연결하는 거예요
네 하지만 하우스 오브 스피릿처럼 가짜 청크를 꺼내는 대신 패스트빈 둡처럼 더블
프리인 대신에 다른 버그 클래스를 이용해서 말로크 메타데이터를 조작할 거예요
검색합니다 로어 디렉터리로 검색하세요 다시 한번 우리 목표인 로어 집의 보안 상태를 확인합니다
체스크를 이용해서요 ? 네
렐로와 스택 카나리아 및 NX 보호를 다루고 있다는 걸 밝히고 있어요 네 2진법은 비좌위 독립적이라 우리가
만들려는 글자를 대상으로 할 수 있어요 글립코 버전 2와
연결되어 있고요 25
기억하세요 특정 글립벡 버전이 사용하는 편익 조치 사항을 상기하고 싶다면
'핸랩랩 PDF'의 '편익 조치' 부분을 검색하세요
네 이제 뭔지 알았으니 동적 분석으로 넘어가죠 ? 네 '로어 하우스 바이너리를 GDB에
로드하고' 'run이나 r로 시작합니다'
사용자 이름을 입력하기 전에 libc와 유출 정보를 관대하게 제공하죠 이제 아시겠죠 사용자 이름을 묻는 건
프로그램 데이터 섹션의 메타데이터를 조작하는 방법이란
걸요
여기서도 마찬가지입니다
일단 쓰레기 같은 데이터나 보내야겠어요
여러분 저희 아이디 로어 하우스 프로그램을 통해 우리가 사랑하는 메뉴를 출력했습니다
네 옵션 1은 말로크를 통해 힙 메모리 6개를 요청할 수 있습니다 이번에는 사이즈가 0x90
이상인 일반 메모리만 사용할 수 있습니다 하지만 캡이 겹쳐져 있어서 0x400 라지빈이
들어갑니다 안 돼요
네 라지빈에 대해 더 배우게 되겠지만 일단 0x430까지
포함된 크기를 요청할 수 있습니다
옵션 2, 늘 그렇듯 0에서 인덱스로 시작해 덩어리를 무료로 제공합니다
네 옵션 3은 인덱스에 따라 덩어리를 편집합니다 사용자 데이터 영역에 쓸 수 있다는 뜻이죠
옵션 4는 타깃 데이터를 프린트합니다
네 GDB에서 ctrl+c로 힙 브레이크 를 살펴봅시다 그리고 'vis' 명령을 내려서 기본 힙의
색상 지도를 출력합니다
네 0x430짜리 덩어리는 화면 면적이 넓어지지만 화면을 스크롤하면 제가 요청한
치수 0x90과 0x430의 시작 부분이 보입니다
네 0x90 청크가 무체계 빈에 연결돼 있어요 2번 옵션에서 풀면 여기
0x430에 쓴 데이터가 보이죠
네 우리 사용자 이름과 대상 데이터의 위치를 'user'에서 'dq' 커맨드와 함께 사 단어를
떨어뜨려 알 수 있습니다
네 이 과정에선 늘 그렇듯 'username' 필드는 신포 명령으로 확인된
프로그램 데이터 섹션의 바로 앞에 있습니다
스피릿 하우스에서처럼 가짜 메타데이터를 위조할 거예요
이제 당신은 로어 하우스 프로그램에 익숙해질 시간을 드리죠 물론
버그를 찾고요 비디오를 정지시켜 주세요
네 버그를 찾았다면 수고하셨습니다 못 찾았다면 로어 하우스 프로그램은
사용 후 삭제 버그라는 문제가 있습니다 ? 사용중지 애프터 프리 줄여서 UAF로 버그를 포괄적으로 표현한
것으로 프로그램이 힙 메모리를 계속 사용하는 것처럼 다룰 때 발생합니다 , 버그
네 생각보다 흔합니다 UAF 버그는 iOS Mac OS Android Microsoft Edge Linux
커널에 대한 정보를 얻었습니다 네 무인항공기 버그는 종류가 다양합니다
무료로 읽을 수도 있죠 유출 가능성 있는 곳이나 경기장 주소
네 메타데이터를 오염시킬 수 있어요 히랩랩에서 혼란스러운 공격
방법을 배울 때 메타데이터를 분석한 것처럼 1부
네 네 프로그램이 호출하는 것일 수도 있어요 그러면 그 오브젝트를 당신이
통제하는 데이터로 바꿔서 실행 흐름을 장악할 수 있죠
저희 로어 하우스 프로그램은 두 번째 UAF 버그에 시달리고 있습니다
어떻게 발현되는지 보여드리죠
로어 이진법으로 검색해 볼게요
네 쓰레기 데이터를 '유저자 이름' 필드에 입력하고 0x90 사이즈로 프로그램
메뉴에서 옵션 1을 요청합니다 위쪽 덩어리와 뭉치지 않도록요 첫 번째 덩어리를 풀면 두
번째 덩어리를 요청할게요
인덱스 0에서 풀게요
ctrl+c로 브레이크하고 '비스'로 힙을 검사합니다
예상대로 기본 더미에 0x90 사이즈 토막이 두 개 있어요 하나는 분리돼서 무체계로
연결됐어요 '분석'이 확인했어요 보세요 사용자 데이터의 1,
2차 쿼드워드 포인터가 흐트러져 있어요
'c'를 계속 누르고 프로그램 메뉴로 프린트하기 되돌아가 옵션 3을 선택합니다
인덱스 0의 청중을 수정하도록 하겠습니다 방금 풀어놓은 것과 동일한 청량입니다
네 보통 이 시점에서 연습 쌍성은 할 수 없다고 하겠지만 이 프로그램은
버그가 없어 무료임에도 계속 편집할 수 있어요
네 충분한 데이터를 보내 앞뒤 포인터를 손상시킬 겁니다 ctrl+c로 브레이크하고
'vis'로 힙을 다시 검사합니다
제 데이터가 청크의 fd와 bk에 덮어썼어요 네 불행히도 안타깝게도
'정신 상실' 명령 출력에도 없어요
, "비정신 상실"
네 하지만 메인 아레나를 조사하면 확인할 수 있습니다 이 명령을 이용해 메모리를 메인
아레나의 '상자' 필드에 버린다 첫 번째 진입로는 메인 아레나의 정리가 안 돼 있다
정리가 안 된 fd와 bk는 첫 번째 파편을 가리키고 있어요
이건 pwndbg 라이브러리의 단점이에요
주석이 없다는 거죠
좋아요 사용 후 버그를 이용해서 인라인 말로크 메타데이터를 조작할 수 있어요
구전 네 ? 네
정서가 불안한 부위를 먼저 공략할 거예요
네 사실 전에도 해 봤어요 1부에서 배운 무체중 공격 기억하시죠?
네 네 포인터를 포인터로 대체해서 피살자의 청크를
지정하거나 분류할 때 주소를 적는 거죠 안 정제된
청크의 주소
아마 그 순간에는 모르고 있었을 거예요 이렇게 함으로써 가짜 청크를 무체계화한 것에 연결했죠
물론 가짜 청크는 할당되지 않았을 거예요 무체계화한 공격의 결과에만 관심이 있었으니까요
가짜 덩어리를 다른 곳에 분배하거나 분류하면 말록이 오렌지원의 기술을
이용해 그 점을 참작할 수 있다는 걸 이용했죠
하지만 이번엔 fake 청크를 할당해야죠 그러니 pwntools 라이브러리를 꺼내 뭐가
나올지 보죠
pwntools_template를 복사하세요 파이 파이튼 스크립트를 선택 편집기에서 여세요
네 일반적인 도우미 기능이 있어요 '사이즈' 인수를 받고 프로그램
메뉴 1을 마무리합니다 "마록" 네 무료 '인덱스' 인수를 받고 옵션 2를 종료합니다 그리고 '인덱스'와 '데이터'
인수를 받고 옵션 3을 종료합니다
네 템플릿 스크립트의 하단을 스크롤하면 그런 도우미 함수의 사용 예가 나옵니다
네 사용자 이름과 관련된 코드를 유지하죠 두 사람이 맬록에게 청크 A와 B를
요청하면 청크 A가 풀려납니다 ? 네 편집을 위해 전화를 삭제하세요
네 그럼 디폴트 힙에 정상 덩어리가 2개 남아요 하나는 자유롭고
무체계화된 빈에 연결됐죠 네 이 견본은 0x10 사이즈하고 0x90 사이즈로
되어 있는데 이 사이즈는 별다른 차이가
없어요 이번에는 0xa0 덩어리를 예로 들어볼게요
사실 보통 크기의 덩어리면 돼요
GDB와 NOASLR 옵션으로 스크립트를 실행하세요
ctrl+c로 브레이크하고 'vis' 커맨드로 힙을 검사합니다
네 예상대로 0x10 덩어리가 무체중 상태에 놓여 있고 0x90 덩어리가 할당돼 있습니다
네 버그가 없으니 이제 0xa0 청크를 쓸 수 있어요 그걸 써서 포인터를 덮어쓰죠
프로그램의 '사용자 이름' 필드에 가짜 청크의 주소도 쓰고요
GDB를 닫고 컨트롤+d를 닫고 편집기로 돌아갑니다.
편집에 전화를 추가하세요 무료로 전화를 건 후 도움 기능을 추가하세요
네 버그를 이용해서 오류 부분을 편집할 거예요 불필요한 데이터 1사분자를
보내 fd를 덮어쓰는 거죠 그리고 곧 가짜가 될 bk를 덮어씌울 지점을 알려준다
줄을 추가하고 일반적인 옵션으로 스크립트를 다시 실행합니다
차를 부수고 조사해요
네 0xa0 청크는 아직 정리가 안 된 상태지만 버그 덕분에 bk는 이제 타깃
데이터와 겹치는 가짜 청크를 가리킵니다
명령에 따르면 그 '망측한' 목록이 오염됐습니다
잘 봐요 주요 경기장의 정리가 안 된 bk는 a 구역으로 이어져요 기본 더미에 있는 0xa0
크기의 덩어리죠 그리고 그 덩어리는 '사용자'를 가리키고요
네 네 하지만 0x0 크기의 메타데이터를 요청하면 다음과 같은 일이 일어날
거예요 말록은 0x0 스몰빈이
빈 걸 보고 정화되지 않은 스몰빈을 찾아 0x0 조각을 찾을 거예요 맞아요,
네 정돈되지 않은 채 뒤에서 앞으로 수색합니다 말록은 정돈되지 않은
주 경기장의 bk를 따라 0xa0 덩어리로 갑니다 사이즈가 요청 사이즈와 일치하는지 확인합니다 부분적으로는
링크를 해제하고 할당합니다
0x0 크기의 덩어리를 요청하죠 그리고 계속 프로그램 창으로 가보죠 메뉴 출력을 누르고
옵션 1로 0x98바이트짜리 사용자 데이터를 요청합니다
창가로 돌아가 창문을 깨고 살펴본 후 다시 정신을 차립니다
네 네 하지만 더 중요한 건 메인 경기장의 정돈되지 않은
bk가 '유저' 스트럭츠를 가리키고 있다는 거죠 거기서
가짜 덩어리를 만들 거예요 ?
네 맞아요 '사용자' 스트럭트에 메모리를 올리면 가짜 청크의 fda에 적힌 무체제
빈 주소를 볼 수 있어요 일부 연결이 끊길 때 생기는 부작용이죠 무체제 빈 공격이라고
부르는 거예요 ?
경험상 네 정서가 없는 bk를 따라 '사용자'
스트럭트까지 가죠 유효한 크기장이 부족하면 말록의 착취
완화가 촉발됩니다 ,
네 네 정상 참작이 안 돼서 가짜 덩어리를 할당
못 하도록요
편집기로 돌아가서 "username" 필드로 보내는 데이터를 수정해보죠 가짜 청크 메타데이터를
준비하는 곳입니다
네 우선 잊지 마세요 아까 수동으로 만든 0x0 크기의 덩어리를 추가해야 해요
좋습니다 다음
다음은 안티오키드입니다
요청할 수 있는 한 어떤 크기든 될 수 있죠
퍼즐 조각이 하나 더 있어요
네 가짜 조각을 배치할 때 부분적으로 연결이 끊길 때 말록이 bk를
따라가서 fd 위에 있는 무체계 주소까지 복사할 거예요 또 방향 감각을 잃었군요 말하자면요
네 네 이진법은 비좌지 독립적이니까 쓰기 쉬운
부분에 주소만 쓰면 돼요 ?
좋아요, 네 두 번째 무체제 공격의 효과를 볼 거예요 안목 없는 두 번째 공격요
그런 변경을 하고 나면 보통 옵션으로 취약점 스크립트를 실행합니다
'정신 분별력을 잃고' '정신 분별력을 잃고' '인조 살덩어리에 부딪혔음을
확인하라'
기억 네 쓰일 수 있는 기억을 가리킵니다
"데어리퀸" 둘 다 목표 데이터보다 먼저죠
네 네 말록이 주변을 수색해서 가짜 몸통을 발견하고
우리 요청에 맞는 크기를 확인한 후 할당해 줄 겁니다
?
이제 스크립트를 이용해 봅시다. GDB를 닫고 에디터로 돌아갑니다.
네 0xa0 크기의 청크를 요청한 다음에 추가할 수도 있지만 바로 가기를 이용해
Fake 청크를 직접 요청할 수 있어요
네 네 부패한 bk를 따라가서 가짜 덩어리를
한 번에 찾을 거예요 네, 맞아요
요청의 크기를 0x98에서 0xd8로 변경합니다 혹은 가짜 청크 크기에 맞는 충분한 사용자
데이터를 제공합니다 0xe0 크기가 아니라면요 이 덩어리에 '오버랩'이라고 라벨을 붙일게요 목표물과 겹치니까요
그리고 편집을 이용합니다 helper 함수로 Fake 청크에 4개 쿼드워드 필러를 써서 Fake
청크의 사용자 데이터와 대상 사이의 거리를 확보합니다
그다음 대상 데이터를 덮어쓰고 싶은 걸 보내죠
네 대사를 추가했으면 GDB와 NOASLR 옵션으로 개발을 실행하세요 alt+를 입력하고
메뉴 프린트로 돌아가기 옵션 4를 눌러 대상 데이터를 프린트합니다 그럼 로어 하우스를
이용해 임의로 작성했다는 걸 알 수 있죠 우리가 메인 아레나를 어떻게 떠났는지
보고 싶다면 GDB로 돌아가 ctrl+c로 브레이크하고 무체계화된
빈을 검사하세요
네 네 ?????
그 장소에 메모리를 보내면 무체제 빈의 주소를 fd에 복사한 걸 알 수 있어요 말로크는
거기라고 생각했죠
가짜 덩어리를 나눠주면 무체중 발작도 공짜로 겪을 수 있죠
기억하시죠? 이 효과를 볼 수 있도록 제가 임의로 장소를 골랐다는
걸요 재향 군인회 공간에 있는 어떤 메모리든 가리켰을 수도 있죠
네 민속 가문에 적용했을 때 주목할 만한 점이 있어요 예를 들면
네 첫 번째는 패스트빈에서 가짜 덩어리를 할당하듯이 가짜 덩어리를 잘못 배열할 수 있다는 거예요
네 자연적으로 발생하는 크기 필드를 찾는다면 앞뒤로 큰 숫자를 포함해 무효한
플래그 조합을 사용해도 됩니다
두 번째는 가짜 덩어리를 컨트롤하기 때문에 잠재적으로 다른 가짜 덩어리를
가리킬 수 있어요 그리고 그걸 할당하죠 계속요
네 심지어 위조품을 같은 가짜 덩어리에 대고 여러 번 할당할 수도 있어요 할당 사이의
bk를 수리하거나 건드리지 않았다면 말이죠
마지막으로 PDF에 있는 '감량' 부분을 보면 글립벡 버전 2에서
감량된 게 보일 거예요 29살요 로어 가문에도 영향을 미치죠
방금 한 걸 요약하자면 구전 기술로 혼란을 해결했어요
우선 네 정리가 안 된 청크의 공격과 비슷하죠
맞아요,
네 피해자 청크의 bk를 메모리 상 다른 곳에 준비해둔 가짜 청크에 가리켰어요 목표 데이터와
겹치는 곳에요
네 네 먼저, 크기계가 정돈되지
않은 크기 검사를 통과해야 하죠 즉, 유효한 최소 사이즈와 전체 메모리의 차이를
고려해야 합니다 ? 네 현재 스레드 아레나는 arena의 'sy시스템_mem'
필드에 보관된 값 커널에서 확인됐습니다
두 번째 제약 조건은 Fake 청크의 백워드 포인터는 쓰기 가능한 메모리의 주소를 갖고
있어야 해요 부분 언링크 동안 참조되고 쓰기 작업에 사용되니까요
네 이 두 제약을 다 충족하면 무체계 상태의 가짜 덩어리를 할당해 같은
크기로 요청한 다음 타깃 데이터를 덮어쓰는 데 사용합니다 ? 네
저건 법의 집 무정돈판이죠 나중에 기억을 되살리고 싶다면 주석화된
폰툴 인크리츠를 다운로드하세요
그리고 잊지 마세요 이 기술은 PDF 파일에 윤곽이 잡혀 있고 흐름표에도 나와
있어요 말록이 흐름을 찾을 때와 찾을 때 어디로 가는지 적혀 있죠
다음 영상에서는 로어의 집을 스몰빈에 적용하는 방법을 알아보죠