이 영상에서 우리가 대답할 질문은 이겁니다 '어떻게 하면 실행의 흐름을' '독단적인 글씨로 장악할
수 있을까요?' 네 그럼 aslr
지역 관점에서 생각해보죠 함수 포인터 같은 모든 유용한 데이터를 담고 있는 스택을 목표로
삼을 수 있습니다 저장된 반환 주소는 말할 것도 없고요
하지만 stack state는 프로그램에 의존적입니다.
아… 게다가 이번 경우에는 저장소가 aslr 소유인데 아직 주소도 유출되지 않았고요
스택이 나왔어요
2진법을 노릴 수 있어요
목표 데이터를 오버랩할 때 이미 했던 일이죠 PLT나 Fini 어레이 같은 구조를
손대면 코드 실행이 발생할 수 있습니다
완료 완료성을 위해 프로시저 링크 테이블, 혹은 PLT는 쓰기 가능한 함수 포인터의
배열입니다 프로그램이 호출하는 모든 함수는 글리벡 같은 외부 라이브러리에 있는데 PLT에 나타나요
네 네 함수가 처음 호출됐을 때 주소가
결정되는 거죠 ,
착수물 표지를 덮어쓰는 건 집행의 흐름을 장악하기 좋아요
예를 들어 이 이진법은 글리벡이 제공하는 printf를 사용합니다 printf를 덮어쓰면 () (행동하고자
하는 코드의 주소로 PLT 항목을 쓰면
다음에 프로그램이 printf를 호출하려 할 때 () 우리 코드는 대신 실행됩니다
네 fini 배열은 또 다른 함수 포인터 배열입니다
fini 배열의 각 함수는 프로그램 exit으로 불립니다 ??? 네
네 슬롯머신을 덮어쓰면 프로그램을 강제 탈퇴시킬 경우 실행의
흐름을 가로챌 수 있습니다
네 안타깝게도 안타깝게도 피델과 피니 배열은
초기화 후에 읽기 전용이라고 표시됩니다 ,
바이너리도 아웃이에요
고철 덩어리를 노리죠
네 그러면 물이 많이 샐 필요가 없어요 상단과 표적 사이의
거리가 상대적이니까요
네 힙에 함수 포인터나 다른 민감한 데이터가 있다면
좋겠지만 안타깝게도 이 경우에는 우리 데이터밖에 없어서 힙이
제거됐습니다
libc가 유출됐는데
뭘 노리죠?
네 libc에는 프로시저 연결 테이블이 있고 _exit_funcs와 tls_dtors라는 두
구조와 함께 피니 배열과 비슷하게 작동합니다
하지만 글리벡 PLT가 프로그램 수명 내내 작성되긴 하지만 그 안의 함수로 호출을 촉발하는
건 어려울 수 있습니다
게다가 _exit_funcs와 tls_dtors 모두 포인터 가드가
보호하고 있어서 조작이 상당히 어렵습니다
하지만 알고 보니 집행의 흐름을 장악할 수 있는 아주 특별한 방법이 있었습니다
말록 훅을 말하는 겁니다
네 말록의 핵심 기능은 각각 달라요 공짜이기도 하죠 글록 데이터 섹션에 있는
쓰기 기능 포인터와 연결되어 있어요
그렇습니다 일반적인 상황에서는
평소라면 ,
포탄을 투하할 때 쓸 거예요
지난번 영상에 나온 공격성 영상을 복사해서 편집기에서 열어 봐요
난 내 걸 편집할게요
네 추가한 네 줄로 가보죠 첫 번째 줄은 남겨둡니다 이것이 초기의
힘을 만들어냅니다 윗부분의 덩어리를 덮어씌워 큰 가치를 갖게 하죠 넘치게
하면요
네 이번에는 큰 배분량을 써서 멀리까지 가볼 겁니다 상단부와 말록고리의
차이점이죠
네 네 ?
네 이제 델타 기능을 쓰지 않아도 돼요 이 덩어리가 전처럼 재향 군인회 공간을 감싸지 않을 테니까요
네 '거리' 변수를 libc로 설정하면 돼요 우리 스크립트에 있는 글립코 공유 개체를
뜻하죠 심을 이용해
심에 접근합니다 바늘의
기호는 밑줄입니다 바늘 밑줄이죠
네 주소에서 0x20을
빼죠 아까 한 것처럼요 말록 고리 바로 앞에서 할당량이 중단됩니다
네 말록 훅과 상부 훅의 차이도 계산해야
합니다 아까와 같은 방법으로 계산할 거예요 힙에 0x20을
더해서 요청한 대로 0x20 크기를 계산할 거예요
프로세스가 어떻게 되는지 보죠 네 마지막 요청에
대해 설명하세요 gdb와 NOASLR 옵션으로
취약점 스크립트를 실행하세요 , 네 GDB를 ctrl+c로 입력합니다 이번에는
멀록훅 주변의 메모리를
검사합니다 멀록훅의 주소는 'dqq'와 함께요 16 대신 2를 사용합니다 왜냐하면
gdb가 포인터 계산을 하기 때문입니다 넘기는 유형에 따라 다릅니다
이 null 4자어는 맬록 훅입니다 아까 말씀드렸듯이
함수 포인터죠
이렇게 무효면 무시당하고 말로크에 호출됩니다 기능은 정상입니다 null이 아니면 말로크에게
걸려 온 전화는 있는 주소로 재전송됩니다
네 네 여기 상단을 남겼습니다
말록 훅을 덮어쓰기 위해서죠
보세요 이번엔 위쪽을 훨씬
적게 제거했어요 더미와 목표물 사이의 거리가 훨씬 좁았거든요 하지만 이번엔 달라요
위쪽 덩어리에 다시 요청해서 말록 갈고리를 덮어씌우죠 GDB를 닫고 컨트롤+d를
닫고 편집기로 돌아갑니다. 마지막 요청을 네
p64) 함수를 이용해서요
,
네 스크립트를 실행하세요
명령어 프린트 @말록훅으로
말록훅을 검사하세요
데드비프 가치 때문에 덧씌워졌다는 게 확인됐습니다
다음부터 실행이라고 불리는 다음번 실행 때는 지도에 표시되지 않은 이 주소로 재전송됩니다
계속합시다, 윈도우를 대화형 프롬프트로 바꾸고 어떤 크기로든
요청을 합니다
보통 이 시점에서 데이터를 요청하는데
응답이 없어요
윈도우를 GDB로 다시 바꾸면
유효하지 않은 주소 0xdeadbeef에서 실행이 멈춥니다
좋아요
그러니까 말록 갈고리를 덮어쓰고 말록을 부르면 집행의 흐름을 장악할 수 있어요
이제 문제는 실행할 것이 무엇인가입니다 상황에 따라 달라지기도 하죠 서비스 거부만으로도
충분할 겁니다 민감한 정보를
흘리고 싶으신가 보군요
우리는
껍데기를 원하는데 그걸 얻는 방법 중 하나가 글리벡
시스템이에요
네 시스템 페이지는 단순한 함수로 단일
인수를 취하고 셸 명령으로 해석된 문자열에 포인터를 두죠
네 따라서 GLIBC 시스템으로
실행을 리디렉션하면 () 함수 문자열 'bin/sh' 주소를 전달합니다 셸 실행 파일 중 하나로 가는
경로죠
이 프로세스는 셸을 제공합니다
편집기로 돌아가서 멀록 후크에 입력한
유효하지 않은 0xdeadbeef 주소를 글리브의 시스템 주소와 바꿔치기해 보죠
앞으로 맬록으로 오는 전화는 시스템으로 재통보됩니다
또한 말로크에게 원래 전달된 변론은 시스템으로 전달됩니다
"bin/sh" 문자열 주소를 요청 크기로 위장할 수 있다는 거죠
이제 남은 질문은 " string /bin
/sh를 어디서 찾죠?" 입니다 네 글쎄요 우리 경우에는 누수가 심각해요
그래서
명령어를 적어 두는 것도 한 방법이죠
네 큰 요청을
할 때 그걸 무효화하는 걸 잊지 않고 명령의 주소를 기록하면 되죠 두 번째 사용자 데이터의
시작에 있는 주소요 ? 그러니 그 주소를 말로크에게 전달해
네 이제 스크립트를 실행하면 이번에는 제작 조건에서 gdb와 noASLR
옵션 없이 마지막으로 맬록에 전화했을 때 껍데기를 제공합니다 ? 네
네 그래서 요약하자면 우리는 넘친 물을 이용해 원시적인 힘의
집을 지었습니다 가장 큰 덩어리를 큰 가치로 덮어씌웠죠
그리고 상단에 큰 요청을
해서 힙과 말록 훅 사이의 간격을 글로브의 데이터 섹션에 포함했어요
네 다음 요청에 따르면 말록
바늘이 겹치는 부분이 나왔고 글록의 시스템 주소와 겹치게 작성했습니다
그리고 사령부 주소를 말로크에게 마지막으로
요청했습니다 크기 논쟁으로 가장해서 실행하고 싶었죠
네 이 경우에는 '빈 시'라는 명령이 있었어요 탄피를 원했고 그걸 지폐에 써 놨거든요 ? 네
말로크에 연락한 건 시스템으로 연결됐고 우리가 원하는 소라 껍데기를 줬어요
네 명령어를 쓰는 것 말고 다른 방법이 있습니다 문자열 "bin/sh"는
glibc 공유 객체 내에 존재합니다
네 그 이유는 시스템과 같은 기능을 하기 때문이죠 이미
execve syscall을 통해 run/bin/sh와 동등하게 실행되는데 프로그램이 전달한 명령을 실행하는 데 사용됩니다
기존의 "bin/sh" 문자열을 libc 공유 객체에 이렇게 쓸 수 있죠
스크립트를 다시 실행하면 같은 결과가
나옵니다, 셸이죠
포스 하우스 기술은 여기까지입니다
초기 버전인데 글립코 버전 2와
잘 어울려요 28 이하요 글립코 2 29는 네
상단 크기 검사를
비교함으로써 이 기술을 완화합니다
맞아요 네 표적이 같은
고물에 있어서 말록에게 제멋대로 큰 요구를 할 수 있는 게 아니라면요 , 하지만...
다시 말씀드리지만 우리가 밟았던 단계들이 잘 기억나지 않으신다면 이 섹션의 리소스에서
다운로드 받을 수 있는 주석이 있는 솔루션 스크립트가 있습니다
그리고 잊지 마세요 힘의 집 개요도
찾을 수 있고 지금까지 다룬 PDF 내역도 전부 찾을 수 있어요
다음 영상에서는 말록의 내부를
익혀서 두 번째 더프 활용 기술을 알아보겠습니다 패스트빈 둡입니다