네 이 영상에서는 취약한 첫 쌍성을 대상으로 첫 번째 기술을
배워 볼 겁니다 힘의 집이라고도 하죠
2005년에 처음 기록됐어요 말록 말레피카룸이라는 책에서요 한동안
글록 더미 착취 성서로 여겨졌죠
바로 환영 환영으로 불리는 작가는 다섯 가지의 일반적인 착취 기술을
개발해서 프라임 가문이라고 명명했습니다 마인드 포스 전설과 영혼
그 후로 많은 기술들이 '가'라는 이름의 규칙을 따랐습니다
그럼 힘의 집으로 곧장 들어가 보죠
아직 집에 안 계시면 거기로 돌아가세요 첫 번째 취약한 쌍성은 이름에
걸맞게 힘의 집입니다
C로 쓰인 소형 CTF 쌍진법이에요 엄청난 버그가 있는데 포스 하우스 기술을
활용할 거예요
네 취약한 쌍성을 만날 때마다 pwntools에 설치된 checksec
기능으로 보안 상태를 배울 수 있습니다 이 쌍성은 64비트예요 취약한 다른 쌍성도 마찬가지죠
네 렐로 전체와 함께 모이죠 이 쌍성들도 마찬가지고요 프로그램의 구역 배치도를
메모리로 변경하는 취약점 완화 기능입니다 전체 렐로는 일부 구역을 초기화
후 읽기 전용으로 매핑합니다
그건... 착취 시도는 개별 쌍성보다는 글립비에 초점을
맞추기 때문에 그건 문제가 안 돼요 이 이진법도 NX로 컴파일됐어요 DEP라고도
하죠
한 쌍성을 제외한 모든 쌍성의 경우입니다 NX는 네 취급될
수 있는지에 대한
확신을 줍니다
파이 파이는 독립 위치 실행의 약자입니다 이 2진법은 독립 위치가 아닙니다 런타임에
주소를 알 수 있다는 거죠 ?
이 정적 위치에서 임의로 쓰기를 대상으로 합니다
그렇죠 안 그러면 ASLR이나 주소 공간 레이아웃 임의화에 처하게 되는데 스택과 라이브러리가
임의 주소로 로드된다는 뜻이죠
하지만 도전 쌍성은 모두 독립적인 위치예요
끝으로 이런 런패스 값은 보안과 관련이 있습니다 왜냐하면 이 바이너리가 사용자가 제어하는
디렉터리에서 글리벡 같은 중요한 라이브러리를 검색하기 때문입니다
네 네 안 돼요, 안 돼요
기준에 맞지 않는 런패스는 무더기로 착취할 필요가 없습니다
좋아요 취약한 두 종족을 먼저 파악해 두죠 command 'gdb- house of_po'로 GDB에
로드하면 런타임에 프로세스의 힙을 검사할 수 있습니다 '런' 커맨드로 중단점 설정 없이 바이너리를
실행합니다
프로그램 제목이 나오고 주소가 두 개 나옵니다
첫 번째는 글리벡 내의 버튼 주소예요 거기서 글리벡의 화물 주소를 추론할 수 있어요
두 번째는 첫 번째 단계의 시작 주소입니다
ASLR이 뭐 대수라고요
네 엄청난 부정부패로 글립코 주소를 유출할 수 있어요 적어도 한 쌍성은 그렇게
나오지 않을 겁니다
하지만 새로운 기술을 배울 때 취약한 쌍성이 주소를 흘릴 거예요 우리가
기술에 집중할 수 있게요
유출된 주소 아래에 번호가 적힌 메뉴가 있어요 옵션 1은 말록 기능을 통해 힙 메모리 4개를
요청할 수 있습니다 원하는 메모리의 양을 요구받습니다
24바이트 요청합니다
그러면 메모리에 쓰고 싶은
데이터를 요청받습니다
대문자로 Y를 보낼게요
이 쌍성이 말로크와 직접적인 인터페이스라는 것 외에는 가식이 없어요
말초 기능에 얽매이지 않고 기술을 배울 수 있게 해 주죠
명심하세요 말록이 원하는 대로 움직이게 하는 건 제작 환경에서는 그리 간단하지 않습니다
이제 힙이 생겼으니 상태를 보도록 하죠 네 GDB를 컨트롤 + c로 길들일 수 있습니다
그리고 힙을 시각화합니다 전에 했던 것처럼 'vis' 명령과 함께요
네 pwndbg 명령어가 어떤 건지 알고 싶다면 'pwndbg'를 입력해 모든
명령을 열거하거나 검색어를 사용하면 됩니다
이 무더기는 0x603000에서 시작돼요 네 GDB에서 프로세스가 시작되면 ASLR이
비활성화됩니다
따라서 이렇게 디버그하면
항상 여기서 시작하죠 네 역시 말로크 님이 배정하신 0x20 사이즈에는
24바이트짜리 사용자 데이터가 들어 있습니다
네 0부터 24바이트 사이만 요청하면 같은 크기로 할당됩니다
보세요 저희가 보낸 데이터를
이 덩어리에 작성했어요 사용자 데이터의 시작부터요 4 대문자 y 그리고 16진수의
캐릭터 코드로 나타낸 뉴라인이죠
이 프로그램은 힙 메모리를 임의로 요청해서 데이터로 채우게 해줍니다
자... 다음을 살펴보죠 '계속' 명령을 발령합니다 줄여서 'c'로 하죠
여기서 반환을 누르면 프로그램이 메뉴를 다시 출력합니다
옵션 2 타깃을 출력합니다 최대한 활용할 수 있는 기법을 익힌 후 임의로
원시적인 글을 쓴다고 말했어요 안 돼!
이 원시성을 이용해 타깃 데이터를 덮어쓰는 게 목표입니다 바이너리
데이터 섹션에 있는 짧은 대문자 x죠
자 이 바이너는 비좌지 독립적이라 표적 데이터의
주소를 항상 알 수 있습니다
네 메모리에서 대상을 확인할 수 있어요 컨트롤 + c를 깨고 'dq'나 '덤프 워드'
명령을 발산하면 대문자 x는 0x58 바이트를 나타내는데 주소는 0x602010이에요
2번은 타깃을 성공적으로 덮어썼는지 확인하는 방법이죠
네 특정 주소의 지도에 대한 확신이 없을 때 '신포' 명령이 도움이 됩니다 여기서 대상의 데이터가 이 바이너리
데이터 섹션의 일부란 걸 확인하죠
'continue' 다음에 return은 2진법을 포기한 세 번째 옵션임을 보여줍니다
그럼 이 영상이 끝나면 취약한 집의 바이너리에 익숙해져서 버그가 있는지
확인해 봐요
조립 과정은 볼 필요 없어요 역설계
수업도 아니잖아요
네 예를 들어 옵션 1을 이용해 힙 메모리를 요청하는 걸 시도해볼 수 있어요 그리고 예상보다 더 많은 데이터를
프로그램에 보내는 거죠 ,
좋아요 이진법의 원리에 익숙해지면 다음 영상에서 이 프로그램의 버그를 설명해
드리죠 그리고 함께 활용해 보는 겁니다 ,