도청기는 찾았어요? 만약 그랬다면 다행이지만 걱정 마세요
벌레 사냥 코스도 아니니까요
네 그 힘의 바이너리에 버그가 있어요 힙에
기록된 데이터를 받을 때요
확인 좀 할게요
실행합니다 전에 했던 것처럼 하우스 오브 포스 바이너리를 GDB에 로드합니다 그리고 'run' 명령어로 시작합니다
옵션 1을 이용해 힙 메모리를 요청합니다 전 작게 보이기
위해 최소 크기의 것을 요청하지만 여러분은 어떤 사이즈든 요청할 수 있습니다
사용 가능한 것보다 많은 양의 사용자 데이터를 보냅니다
예를 들어 24바이트짜리 요청에 24바이트짜리 사용자 데이터가 들어 있습니다 스팸을
많이 함으로써 24바이트 이상을 전송합니다 여러분 왜 재미는 대문자 A에게만 주나요?
이제 GDB를 컨트롤+c로 나누고 'vis'로 힙을 검사합니다
네 보세요 말로크가 0x20 크기의 청크를 할당했어요 예상대로요 프로그램에서 사용자
데이터에 대문자 Y를 적었어요
하지만 8 바이트의 입력이 덩어리를 넘치게 한 걸 볼 수 있죠
게다가 우리 데이터가 제일 큰 덩어리를 덮어썼어요
이 바이너는 데이터를 큰 덩어리로 읽을 때 8바이트가 넘쳐요
사실적인 벌레인가요?
예를 들어 긴 정수 집합에서 오차 범위가 1분의 1이었을 수도 있어요 예를 들면요
맞습니다 요점은 바이트 하나가 넘치면 나머지 부분의 크기를 해칠 수 있다는 겁니다
맨 위에 있는 것도 포함해서요
가장 윗부분이
우리가 주목하는 부분이에요
네 흐름을 이용해서 말로크가 본 상단 덩어리의 크기를 조절할
수 있어요 아까 말했듯이 많은 버전의 글립이 상단 크기 확인을 안 하거든요 말로크는 이
가치를 복음처럼 믿을 거예요
어떤 버전의 글리벡과 작업하는지 보죠
'vmmap 명령 pwndg'를 발행하면 나중에 지정할 용어는 모두 그리프하게 됩니다
'vmmap libc'로 범위를 좁힐게요 출력물을 보면 이 바이너리가
글리벡 버전 2와 연결되어 있어요 28번요, 상단 크기에
대한 점검이 없어요 글립벡의 어떤 버전에서 더 심한 착취가 있었는지
알아보려고요 '푸디F'에 '착취'란 있어요
예리한 눈 덕분에 이
확장된 부분을 눈치챘을 거예요 Tcache는 글리벡 버전 2에 소개된 말록의 기능이에요
26살요
네 힙랩 과정 1부에선 티셰를 다루지 않지만 취약한 쌍성 일부는 티셰
없이 컴파일된 맬록 버전을 사용합니다
여러분 이건 단지 증명입니다 이 기술은 글립벡의 후기 버전에서 통합니다 tcache에 대해
먼저 배울 필요가 없죠
오히려 눈덧신토끼가 있어서 말록이 이용하기 더 쉽죠
알아두세요 런타임에 어떤 버전의 GLIBC에 대해 구축되었든 설치된
OS에 사용 가능한 GLIBC 버전을 사용할 겁니다
바로 이겁니다 이 말은 바이너리 기능이 한 플랫폼에서 착취당하지 않는다고 해서 다른
플랫폼에 설치해도 착취당할 위험이 없다는 거죠
이 두 개의 이 두 개의 이론은 예외입니다
학습 목적으로 글립벡의 특정 버전에 강제로 대항해야 하죠 ,
취약한 쌍성으로 돌아가서 초과 인원을 어떻게 할지 생각해 보죠
네 제일 큰 밭을 차지하면 말로리를 속여서 우리가 원하는 크기로 만들 수
있어요 ? 네
이건 단순화된 Linux 프로세스 메모리 맵입니다
"vmmap 명령의 결과물"처럼요
네 일반적으로 바이너는 가장 낮은 주소에서 디폴트 힙이 뒤따릅니다 프로그램 브레이크라고 알려진
지역에서요 ?
그다음은 큰 빈칸이 있고 그다음은 도서관 글립코 또
빈칸이 있고
마지막으로 가장 높은 주소예요
네 이 위쪽을 더 크게 만들어서 값을 높이면 말록이 보기에 위쪽이 이 틈을
가로질러 확장돼서 라이브러리나 굴뚝에
있는 중요한 데이터를 겹칠 거예요
네 하지만 타깃 데이터, 대문자 x는 바이너리의 데이터 섹션에 힙보다 낮은 주소로
있다는 걸 잊지 마세요
맨 위에 큰 덩어리를 표시하면 어떨까요?
그럼 가상 주소 공간의 끝을 넘어간 것처럼 보입니다 시작으로 되돌아가는
거죠
그럼 말로크에게 또 큰 부탁을 하면 이 고물 덩어리가 수리해 줄 거예요
방문자를 감싸는 거죠 A 띄우고 바이너리 데이터 섹션을 겹쳐 줍니다
그게 우리가 할 일이에요
네 이 바이너리를 이용해서 상단 덩어리를 큰 값으로 덮어쓸 거예요 그리고
위쪽 공간을 둘러싼 힙과 타깃
데이터 사이의 간격을 가로질러 크게 요청합니다 그리고 마지막으로
타깃과 겹치는 요청을 하나 더 해서 덮어씌워
이걸 하려면 이 프로그램에 프린트 안 되는 글자를 보내야 해요 계산을
좀 해서 전 과정을 반복할 수 있게 해야죠
폰툴이 나설 차례죠 GDB를 닫고 pwntools_template를 복사하세요 pi 대본
폰만 빼고 뭐라고 부르든 상관없어요 pwntools 스크립트가 하는
첫 번째 일은 pwn이라는 라이브러리를 가져오는 것입니다 py와 스크립트는 스스로 불러오려
할 거예요
카피 xpl이라고 부르겠습니다 py는 착취의 약자로 탭 완성이 쉬워지게 합니다
원하는 편집기에서 복사본을 열어
보세요 vim을 써서 IDE 같은 특별한 게 필요 없다는 걸 보여드리죠
이건 첫 번째 폰툴 스크립트입니다
네 네 포스 바이너리를 실행하고 입력값을 입력하면
보내줍니다
네 텍스트의 양에 놀라지 마세요 대부분은
pwntools입니다 상용 및 도우미 함수죠 Python에서 연습하는 걸 막기 위해 추가했습니다 ?
네, 그렇습니다
이 바이너리를 이용할 코드 네 줄만 쓸 거예요
스크립트 맨 밑을 봐요
네 우리가 고려하고 있는 건 이 점선 사이의 지역뿐이에요 제가 말씀드린
도우미 함수의 사용
예가 있는 곳이죠 통나무부터 시작하죠 인포는 디버그 정보를 출력합니다
기억하시나요? 이 바이너리는 '힙'이라는 변수에 캡처된 힙의 주소를 유출합니다
'elf' 변수는 바이너리를 나타내고 기호에는 엘프를 통해 접근할 수 있어요 심 기호_name을 입력하세요
심 target은
대문자 x의 주소입니다
말록의 기능은 옵션 1을
포장하는 거예요
두 개의 인수가 필요합니다 요청의 크기와 전송하는 데이터요
이 예제는 프로그램 메뉴에서 옵션 1을 선택하는 것과 같습니다 크기를
묻거든 값을 24로 보내고
데이터를 요청하면 임의의 데이터 24 대문자 y를 보냅니다
마지막 줄은 델타 기능을 사용하는데 곧 설명해 드리겠습니다
네 이 스크립트를 실행하면 pwntools가 하우스_of_포스 바이너리를
실행하고
입력값을 전송합니다 그리고
상호작용 프롬프트를 통해 컨트롤을 반환합니다 , 이 스크립트는
한번 해 보죠
명령줄이나 vim에서 스크립트를 실행할 수 있습니다. ? 지휘는?
다음이
셸 명령으로 해석되어야 할 것을 가리킵니다 and %는 이 버퍼의 이름으로 대체됩니다
네 pwntools. 이진법에 대한 체세크 출력을 출력합니다. 로딩을 합니다. 이 경우에는
하우스_offos 바이너리와 글립코 공유 객체입니다. ?
이 세 줄은 그 통나무의 결과물입니다 정보() 전화
마지막으로 프로그램과 직접 대화할 수 있는 프롬프트가 제공됩니다
메뉴 프린트를 위해 리턴을 누르면 4개의 청크 중 하나가 할당된 걸 볼 수 있죠
하지만 이 시점에서 차를 조사할 수 있다면 좋지 않을까요?
매번 수동으로 GDB를 연결할 수도 있지만 pwntools는 더 간단한 방법을 제공합니다.
입니다 옵션 3으로 프로그램을 종료합니다
반환을 한 번 누르면 vim에서 런칭한 경우 파일 끝을 받는다는 폰툴의 메시지를 무시할 수 있습니다 안
그러면 vim에서 런칭한 경우 다시 합니다
이번엔 GDB 옵션을 모두 대문자로 스크립트를 실행하세요
네 pwntools는 아까와 똑같이 합니다. 바이너리를 시작하고, 입력을 보내고, 프롬프트를 제공합니다.
하지만 이번에는 GDB를 첫 번째와 두 번째 단계 사이의 프로세스에 연결하고 별도의 터미널에서 디버깅
세션을 열 것입니다
네 OS에 따라 alt나 옵션 백틱을 이용해 GDB와 프로그램 프롬프트 사이를 바꿀 수 있습니다 ,
우분투를 사용하지 않으면 그 키 조합이 다를 수 있어요
네 네 과정 내내 이 두 개의 창 레이아웃을 이용할 겁니다 이게 Ubuntu에 대한 기본
설정이니까요
학생들이 제 환경처럼 행동하기 위해 많은 변화를 줄 필요가 없죠
네 pwntools와 pwndbg를 모두 이용해 더 효율적인 레이아웃을 사용할
수 있다는 걸 알아두세요 탭이나 분할 윈도우 같은 거요
서류만 확인하면 돼요
GDB를 컨트롤+c로 길들일 수 있습니다. 그리고 평소처럼 'vis'를 이용해 힙을 검사합니다.
대본이 잘 된 것 같아요
0x20 크기의 덩어리를 할당해 대문자로 채웠습니다
좋습니다, 힙 주소가 지금까지 본 것과 다르다는
걸 주목하세요 왜냐하면 gdb에서 시작하지 않고 GDB 옵션으로 스크립트를
실행하기 때문입니다.
즉, ASLR이 실행 중이고 공격은 ASLR 아래서 실행되어야 하지만 디버깅을 활성화하면 번거로울
수 있습니다 그러니 다음에 스크립트를
실행하면 일시적으로 해제하는 법을 알려 줄게
gdb를 닫아서 에디터에게 돌아갑니다. 그리고 return을 누릅니다. 로그 제거를
해서 정리할게요. 이 작업들을 정리합니다. 우리 대본에서 나온 대사예요
네 네 맨 위에 있는 덩어리를 덮어쓰게 됩니다
이 값을 이 맬록의 두 번째 인수에 추가하죠
네 이 부분에서 프린팅 안 된 문자를 보내야 합니다 백슬래시
x를 많이 치지 않고 엔디언성을 고려하기 위해 대신 pwntools를 사용할 수 있습니다 , "pack 64"
또는 p64() 함수 스트럭트 주변의 래퍼죠 짐 싸
네 네 가장 큰 64비트 값을 16f로
설정하는 게 어떨까요? 아니요,
좋아요, 이걸 스크립트에 추가했으면
GDB 옵션으로 다시 실행해요 이번에는
NOASLR 옵션을 모두 대문자로 추가합니다 안 돼요!
GDB에 들어가서 "vis" 명령을 사용합니다. 이것은 힙의 상단 덩어리에 성공적으로 덮어썼다는 것을 보여줍니다.
, 큰 가치를 가지고 있습니다.
여긴 원시적인 힘의 집입니다 말록은
네 ? 네
그럼 2단계 공격으로 넘어가죠
네 네 안 돼요
문 닫고 편집자한테 돌아가세요
우선 상단과 표적 사이의 거리를 계산해야 합니다
네 이걸 위해 델타 기능을 쓸 수 있어요 재향 군인회 공간을 둘러싼다는 사실을
보완하는 거죠
두 개의 논거가 필요합니다 시작과 끝 주소요
시작 주소는 맨 위예요
위치를 알 수 있습니다 이 바이너리가 힙 주소를 유출하기 때문이죠 기억하실 겁니다 pwntools
스크립트가 '힙' 변수에 캡처되어 있습니다 네 이 값에 0x20을 추가합니다 이미 할당된 0x20
크기의 값을 추가합니다 그 결과 맨 위 주소가 나오죠
마지막 주소는 타깃이고 대문자
X는 바이너리 데이터 섹션에 있습니다
이 값에서 0x20을 빼면 목표 데이터에 근접하지 않습니다
네 요청할 부분을 겹쳐 보면 목표물에 도달하기 전에 많은 데이터를
입력해야 할 텐데 프로그램이 읽기
전용이나 지도에 표시
안 된 메모리를 입력하려 할 겁니다 짧은 시간에 멈추고 목표 데이터에
겹치는 부분을 추가하는 게 쉽죠
네 이제 원하는 덩어리의 크기를 계산했으니 요청해서 가비지 한 바이트를 써보죠
? 네
대사를 추가했으면 GDB와 NOASLR 옵션으로 스크립트를 실행하세요
정보기관 방문
네 그리고 이번에는 'dq 대상-16' 명령을 발령합니다 대상 데이터 주변의 메모리를 볼 수 있게
해 주죠
표적이고요 이게
표적입니다 이건 상단 청크 크기 필드죠 프로그램 데이터 섹션 한가운데 있어요 '톱_청크'
명령을 이용해 확인할 수 있죠
보세요 크기가 많이 줄었죠? 조금
전만 해도 64bit 중 가장 큰 수치였어요 ? 네
자 이제 말로크에 다음 요청을 하면 이 녀석이 처리할 거예요 사용자 데이터의
첫 네 글자가 목표물을 가리킬 거고요
수동으로 할 수 있습니다 gdb alt를 계속 사용하거나
옵션 백틱을 이용해 대화형 프롬프트로 변경합니다 옵션 1을 이용해 작은 양을 요청합니다
우리가 쓰는 것은 대상 데이터를 덮어쓰고 옵션 2를 선택하면 프린트됩니다
?
좋아요
스크립트에 마지막 요청을 추가해보죠
2진법 그만 쓰고 편집기
반환해 그럼 한 번 더 호출해서
최소 크기의 덩어리를 요청하고 방금 사용한 문자열을 여기에 쓰겠습니다
실행하세요 이번에는 이번에는 ??
네
옵션 2를 선택해 대상을 프린트합니다 그건 우리가 성공적으로 대상 데이터를 덮어썼다는 걸 확인하죠
우리 것으로요
그게 전부예요
마법부의 기술을 이용해 임의로 글을 썼습니다
요약하자면 이 바이너리에 힙의 오버플로 버그가 있어 활용할 수 있었습니다 힙의 상단 덩어리를
큰 값으로 덮어쓰기 위해서요
네 덕분에 말록이 윗부분이 실제보다 크다고 믿게 됐죠 안 그러면
실패했을 테니 더 크게 할당해야 했어요
요청한 큰 덩어리는 힙과 타깃 데이터 사이의 간격을 간격으로 합니다
그리고 마지막으로 목표물과 겹치는 부분을 요청했어요 그래야 덮어쓸 수 있으니까요
네 우리가 밟은 단계가 잘 기억나지 않으신다면 이 섹션 리소스에서 다운로드 가능한 솔루션 스크립트가
있습니다 제가 방금 보여드린
걸 정확히 하죠 명확성을 위해 주석으로 달았어요
네 잊지 마세요 힘의 집 기술 개요도 찾을 수 있어요 지금까지
다룬 말록 내역도 함께요
그래서 영력궁 기술을 익힌 뒤 임의로 쓰기로 했죠
다음 시간에는 이 임의의 작성을 코드 실행으로 바꾸는 법을 배워보겠습니다