취약점 악용 살펴보기

이 주제에 대해 계속 논의하기를 고대하면서 취약성에 대한 약간의 역사, 이론 및 실습을 말씀 드리겠습니다. 우리 모두는 보안 결함이 많은 비용을 초래할 수 있다는 말을 들었고 소프트웨어를 최신 상태로 유지해야한다는 것을 알고 있으며 많은 업데이트가 보안 버그로 인해 발생한다는 것을 알고 있습니다. 그러나 오늘은 이러한 오류가 어떻게 발견되고 악용되는지에 대해 조금 이야기하겠습니다.하지만 그 전에 우리는 더 나은 개요를 얻기 위해 몇 가지 세부 사항을 명확히 할 것입니다.

시작하기 전에

먼저 내가 악용 한 첫 번째 취약점 인 알려진 취약점에 초점을 맞출 것임을 버퍼 오버플로,이 취약점에서 우리는 재미있는 일을하기 위해 메모리 검증 부족을 이용합니다. 🙂 그러나 그것에 대해 조금 더 명확히합시다.

이것은 실제 시나리오가 아닙니다.

나는 그들이 보는 프로그램을 깨도록 가르 칠 여유가 없다. 첫째는 그들의 컴퓨터에 위험하기 때문에, 둘째는 나의 평범한 단어 할당량보다 더 많이 소요되기 때문이다.

우리는 80 년대 여행을 떠납니다

제가 보여 드리려고하는 것은 제 노트북에서 할 수있는 일이지만 오늘날 간단한 방법으로 할 수 있다는 의미는 아닙니다. 이러한 개념 중 상당수는 이미 여러 번 악용되어 새로운 보호 방법과 새로운 방법을 피할 수 있습니다. 그것들이 나타났습니다 😛 그러나 그것은 우리를 같은 장소로 돌려 보내고, 모든 것을 말할 수있는 공간이 없습니다 🙂

프로세서에서 작동하지 않을 수 있습니다.

아주 간단한 예를 사용할 것이지만, 처음부터이 부분의 세부 사항이 너무 많고 다양하여 나와 똑같이 나올 수 있다는 점을 처음부터 명확하게하고 싶습니다. , 원하는 효과를 얻지 못할 수도 있습니다 🙂 그러나이 공간에서는 설명 할 수 없다는 것을 상상할 수 있습니다. 특히 이번 소개에서는 이미 300 단어 이상을 사용했기 때문에 요점을 곧바로 설명합니다.

무엇입니까 버퍼 오버 플로우

이에 답하려면 먼저이 조합의 전반부를 이해해야합니다.

버퍼

모든 것이 컴퓨터의 메모리에 관한 것이므로 어떤 유형의 정보 컨테이너가 있어야한다는 것은 논리적입니다. 우리가 말할 때 입력 출력, 우리는 버퍼. 짧게 유지하려면 버퍼 그것은 우리가 많은 양의 정보를 저장할 정의 된 크기의 메모리 공간입니다.

이름에서 알 수 있듯이 오버플로는 버퍼가 처리 할 수있는 것보다 더 많은 정보로 채워질 때 발생합니다. 그러나 이것이 왜 중요할까요?

스택

스택이라고도하며, 우리가 할 수있는 추상 데이터 유형입니다. 스택 정보의 주요 특징은 주문이 있다는 것입니다. LIFO(후입선출). 접시 더미에 대해 잠시 생각해 봅시다. 우리는 그것들을 하나씩 위에 올려 놓은 다음 위에서 하나씩 꺼내면 우리가 놓은 마지막 접시가됩니다. )는 우리가 꺼낼 첫 번째 접시입니다. 분명히 한 번에 한 접시 만 꺼낼 수 있고 그 순서대로하기로 결정했다면 P.

이제이 두 가지 개념을 알았으니 순서대로 정리해야합니다. 스택은 우리가 실행하는 각 프로그램이 자체적으로 실행 스택. 하지만이 스택에는 특별한 특징자라다. 이것에 대해 알아야 할 유일한 것은 프로그램이 실행되는 동안 함수가 호출 될 때 스택이 메모리의 숫자 X에서 숫자 (Xn)로 이동한다는 것입니다. 그러나 계속하려면 하나 이상의 개념을 이해해야합니다.

포인터

이것은 많은 프로그래머가 C 세계에서 시작할 때 미치게 만드는 개념입니다. 사실 C 프로그래밍의 강력한 힘은 부분적으로 포인터를 사용하기 때문입니다. 간단하게하기 위해 포인터 메모리 주소를 가리 킵니다. 복잡하게 들리지만 그렇게 복잡하지는 않습니다. 우리 모두 기계에 RAM이 있습니다. 음, 이것은 블록의 연속 배열, 이러한 위치는 일반적으로 0 진수로 표시됩니다 (9에서 0까지 그리고 0x0, 1x0, 6x0, 0xA, 0xF, 10x0과 같은 A에서 F까지). 여기 호기심 많은 메모 10xXNUMX 아니 십진수로 변환하면 10 😛와 같습니다. 15를 말하는 것과 같습니다. 이것은 처음에는 하나 이상을 혼동하는 것입니다. 그러나 그것에 대해 내려 보자.

기록

프로세서는 다양한 기록, 물리적 메모리에서 프로세서로 위치를 전송하기 위해 작동합니다. 64 비트를 사용하는 아키텍처의 경우 레지스터 수가 많고 여기서 설명하기 어렵지만 아이디어를 얻으려면 레지스터가 포인터와 같으며 다른 무엇을 나타냅니다. , 메모리 공간 (위치).

이제 연습하세요

지금까지 처리해야 할 정보가 많았지 만 실제로는 매우 간단한 방법으로 설명하려고하는 다소 복잡한 문제입니다. 버퍼를 사용하는 작은 프로그램을 볼 것입니다. 오버플로에 대해 이해하기 위해 깨 뜨리십시오. 분명히 이것은 실제 프로그램이 아닙니다. 그리고 우리는 오늘날 사용되는 많은 대응책을 "피할"것입니다. 더 복잡한 것을 배우려면 원칙이 필요합니다 😉

GDB

의심 할 여지없이 C 프로그래머가 가장 많이 사용하는 프로그램 중 하나입니다. 많은 장점 중에서 우리가 지금까지 이야기 한 모든 것을 볼 수 있다는 사실, 레지스터, 스택, 버퍼 등이 있습니다. 🙂 예제에 사용할 프로그램을 봅시다.

retinput.c

개인적인. 크리스토퍼 디아즈 리베로 스

이것은 매우 간단한 프로그램입니다. 우리는 라이브러리를 사용할 것입니다. stdio.h 정보를 얻고 단말기에 표시 할 수 있습니다. 다음과 같은 함수를 볼 수 있습니다. return_input 생성하는 버퍼 라고 정렬, 길이가 30입니다. 바이트 (char 데이터 유형은 1 바이트 길이입니다).

함수 gets(array); 콘솔 및 기능별 정보 요청 printf() 배열의 내용을 반환하고 화면에 표시합니다.

C로 작성된 모든 프로그램은 함수로 시작합니다. main(), 이것은 return_input 호출만을 담당 할 것입니다. 이제 프로그램을 컴파일 할 것입니다.

개인적인. 크리스토퍼 디아즈 리베로 스

제가 방금 한 일을 조금 보겠습니다. 옵션 -ggdb gcc에게 gdb에 대한 정보로 프로그램을 컴파일해야 올바르게 디버그 할 수 있음을 알립니다. -fno-stack-protector 분명히 사용해서는 안되는 옵션이지만, 그렇지 않으면 스택에서 버퍼 오버플로를 생성 할 수 있기 때문에 사용할 것입니다. 결국 나는 결과를 테스트했습니다. ./a.out 방금 컴파일 한 것을 실행하고 정보를 요청하고 반환합니다. 실행 🙂

경고

여기에 또 다른 메모. 경고를 볼 수 있습니까? 분명히 우리가 코드로 작업하거나 컴파일 할 때 고려해야 할 사항입니다. 이것은 약간 명백하며 오늘날 기능을 가진 프로그램은 거의 없습니다. gets() 코드에서. 젠투의 한 가지 장점은 각 프로그램을 컴파일함으로써 무엇이 잘못되었는지 알 수 있다는 것입니다. "이상적인"프로그램은이를 가져서는 안됩니다.하지만 얼마나 많은 큰 프로그램이 이러한 경고를 가지고 있는지 놀라게 할 것입니다. 추적하기 어렵고 동시에 많은 경고가있을 때 위험한 기능. 이제 계속하면

프로그램 디버깅

개인적인. 크리스토퍼 디아즈 리베로 스

이제이 부분은 약간 혼란 스러울 수 있지만, 이미 꽤 많이 썼기 때문에 모든 것을 설명 할 여유가 없습니다. 너무 빨리 가고 있다는 것을 알았다면 죄송합니다 🙂

코드 무장 해제

컴파일 된 기계어 프로그램부터 살펴 보겠습니다.

개인적인. 크리스토퍼 디아즈 리베로 스

이것은 우리의 주요 기능의 코드입니다. 조립, 이것이 우리의 프로세서가 이해하는 것입니다. 왼쪽의 라인은 메모리의 물리적 주소입니다. <+ n> 그것은로 알려져있다 오프셋, 기본적으로 함수의 시작 (메인)에서 해당 명령문 (로 알려진 오피). 그런 다음 명령어 유형 (push / mov / callq…)과 하나 이상의 레지스터를 볼 수 있습니다. 요약하면 소스 / 출발지 및 목적지가 뒤에 오는 표시라고 말할 수 있습니다. <return_input> 두 번째 기능을 의미합니다. 살펴 보겠습니다.

반환 _ 입력

개인적인. 크리스토퍼 디아즈 리베로 스

이건 좀 더 복잡하지만 몇 가지만 확인하시기 바랍니다. <gets@plt> 마지막 opcode는 retq 함수의 끝을 나타냅니다. 함수에 하나의 중단 점을 두 개 넣을 것입니다. gets 그리고 다른 retq.

개인적인. 크리스토퍼 디아즈 리베로 스

달리기

이제 프로그램을 실행하여 작업이 어떻게 시작되는지 살펴 보겠습니다.

개인적인. 크리스토퍼 디아즈 리베로 스

우리가있는 opcode를 나타내는 작은 화살표가 나타나는 것을 볼 수 있습니다. 방향을 고려하기를 원합니다. 0x000055555555469b,이 주소는 return_input 기능상 main , 이것은 당신이 수신을 마치면 프로그램이 반환되어야하는 곳이기 때문에 중요합니다. 입력, 함수를 시작하겠습니다. 이제 함수에 들어가기 전에 메모리를 확인하겠습니다. gets.

개인적인. 크리스토퍼 디아즈 리베로 스

나는 당신을 위해 주요 기능을 백업했고, 당신이 볼 수 있듯이 내가 언급 한 코드를 강조했다. 엔디안 두 개의 세그먼트로 분리되어 있으므로 방향을 고려하고 싶습니다. 0x7fffffffdbf0 (특공대 이후 왼쪽에서 첫 번째 x/20x $rsp) get의 결과를 확인하는 데 사용해야하는 위치이므로 계속하겠습니다.

프로그램 속보

개인적인. 크리스토퍼 디아즈 리베로 스

나는 그것들을 강조했다 0x44444444Ds의 표현이기 때문에 🙂 이제 우리는 추가하기 시작했습니다 입력 보시다시피 원하는 주소에서 두 줄 밖에되지 않습니다. 이전 단계에서 강조 표시 한 주소 바로 앞에 올 때까지 채울 것입니다.

반환 경로 변경

이제 함수의 반환을 나타내는 코드의이 섹션을 입력 했으므로 잠시 전에 가지고있는 opcode의 위치로 이동하는 대신 주소를 변경하면 어떻게되는지 살펴 보겠습니다. 우리가 돌아 가면 어떻게 생각하세요 return_input? 하지만이를 위해 우리가 원하는 주소를 바이너리로 써야합니다. 함수로 할 것입니다. printf bash에서 🙂

개인적인. 크리스토퍼 디아즈 리베로 스

이제 우리는 정보를 두 번 받았습니다. 😀 확실히 프로그램이 만들어지지는 않았지만 코드를 깨뜨려 서하지 말아야 할 것을 반복하도록 관리했습니다.

반사

이 간단한 변화는 이용 아주 기본적인 🙂 그는 프로그램을 깨고 우리가 원하는 일을했습니다.

이것은보고 추가 할 거의 무한한 목록의 첫 번째 단계 일뿐입니다. 단순히 주문을 반복하는 것보다 더 많은 것을 추가 할 수있는 방법이 있습니다.하지만 이번에는 다음과 관련된 많은 내용을 작성했습니다. 쉘 코딩 기사, 완전한 책보다 더 많이 쓰는 주제입니다. 내가 좋아할 주제에 대해 조금 더 탐구하지 못했다면 미안하지만 분명히 기회가있을 것입니다 🙂 여기에 오신 것을 환영합니다.


코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   2p2

    더 직접적입니다. 적은 글을 쓰고 중요한 것에 집중하세요

    1.    크리스ADR

      안녕하세요, 댓글 주셔서 감사합니다.

      솔직히 말해서 아이디어의 좋은 부분을 잘라 냈지만 그래도 프로그래밍 지식이없는 사람이 아이디어를 얻을 수 있도록 최소한으로 남겨둔 것 같았습니다.

      안부

      1.    익명

        문제는 프로그래밍 지식이없는 사람들은 시작하기에는 너무 복잡하기 때문에 아무것도 알지 못할 것이지만, 프로그래밍 방법을 아는 사람들은 더 직접적임을 고맙게 생각한다는 것입니다.

        나는 당신이 모든 사람에게 다가 갈 수 없다고 생각합니다. 당신은 선택해야합니다. 그리고이 경우에 당신은 많은 것을 덮고 싶어서 죄를지었습니다.

        그건 그렇고, 나는 건설적인 비평으로 당신에게 말하고, 나는이 주제를 좋아하고 당신이 계속 기사를 쓰고, 축하합니다!

    2.    익명

      나는 생각한다.

      1.    크리스ADR

        둘 다 대단히 감사합니다 !! 이 기사를 읽는 고급 수준의 프로그래밍을 가진 사람이 적다는 사실이 사실이라면 대상 청중에게 도달하는 방법을 이해하는 것은 확실히 어렵습니다 (적어도 댓글을 통해 추론 할 수 있음).

        나는 이해하기 위해 광범위한 지식 기반을 요구하는 것을 단순화하고 싶어서 확실히 죄를지었습니다. 제가 블로깅을 막 시작했기 때문에 독자들이 제가 말하는 내용을 알고 이해하는 정확한 지점을 아직 발견하지 못했음을 이해하시기 바랍니다. 진실을 말하기가 훨씬 쉬워 질 것입니다 🙂

        콘텐츠와 글쓰기 방식을 분리하는 것은 상상하는 것보다 조금 더 복잡하기 때문에 형식을 비인격 화하지 않고 합당 할 때 더 짧게 만들려고 노력할 것입니다. 적어도 나는 그것들이 상당히 연결되어 있지만 궁극적으로 내가 할 수있을 것이라고 생각합니다 내용을 자르는 대신 줄을 추가합니다.

        안부

  2.   마리오

    주제에 대해 더 많이 알 수있는 곳은 어디입니까? 추천 도서가 있습니까?

    1.    크리스ADR

      Chris Anley, John Heasman, Felix Linder 및 Gerardo Richarte의 The Shellcoder 's Handbook에서 얻은 예제는 64 비트 번역을 수행하기 위해 아키텍처에 대해 배워야했습니다. 인텔 개발자 매뉴얼, 볼륨 2와 3은 꽤 신뢰할 수있는 소스입니다. 또한 'info gdb'명령과 함께 제공되는 GDB 문서를 읽는 것도 좋습니다. Assembly 및 C를 배우려면 Assembly 책이 약간 오래되어 다른 책으로 채울 간격이 있다는 점을 제외하면 아주 좋은 책이 많이 있습니다. 유형 문서.

      셸 코드 자체는 오늘날 여러 가지 이유로 더 이상 효과적이지 않지만 새로운 기술을 배우는 것은 여전히 ​​흥미 롭습니다.

      도움이되기를 바랍니다 🙂 인사말

  3.   프란츠

    Buen artículo, el viejo blog desdelinux ha vuelto a renacer =)
    원격 셸이 그다지 효과적이지 않다고 말하면 공격을 완화하도록 설계된 대책을 의미하며 공격 보안이라고합니다.
    인사하고 계속

    1.    크리스ADR

      Franz 🙂 매우 친절한 말에 감사드립니다. 사실 저는 오늘날 Shellcoding이 여기에서 보는 것보다 훨씬 더 복잡하다는 것을 의미했습니다. 우리는 스택 보호기 인 ASLR (무작위 메모리 위치 생성기), 프로그램에 삽입 할 수있는 opcode의 수를 제한하는 다양한 조치 및 대책을 가지고 있으며 이는 시작에 불과합니다.

      감사합니다,

  4.   무료 소프트웨어

    안녕하세요, 화제를 확장하는 또 다른 부분을 하시겠습니까? 흥미 롭군

    1.    크리스ADR

      안녕하세요, 주제는 확실히 꽤 흥미롭지 만, 우리가 취할 복잡성의 수준은 매우 높아질 것이며, 아마도 다른 것을 이해하기위한 다양한 전제 조건을 설명하기 위해 많은 수의 게시물을 포함 할 것입니다. 나는 아마 그것에 대해 쓸 것입니다. 그러나 그것은 다음 포스트가 아닐 것입니다. 저는 이것을 계속하기 전에 몇 가지 주제를 쓰고 싶습니다.

      인사하고 공유해 주셔서 감사합니다

  5.   선인장

    아주 좋은 체! 훌륭한 게시물을 올리고 있습니다! 한 가지 질문은 "펜 테스트를 통한 보안 보장"이라는 책을 읽고이 IT 보안 문제를 시작하는 것입니다. 이 책이 추천 되나요? 이러한 문제에 대해 문의하기 시작하는 방법은 무엇입니까?

    1.    크리스ADR

      안녕하세요 선인장, 그것은 취약점에 대한 전체 우주입니다. 진실을 말하기 위해서는 무엇이 당신의 관심을 끌고 필요한지에 달려 있습니다. IT 관리자는 펜 테스터와 똑같이 알 필요가 없습니다. 또는 취약성 연구자 또는 법의학 분석가 인 재해 복구 팀은 매우 다른 기술을 가지고 있습니다. 분명히 그들 각각은 다른 수준의 기술 지식이 필요합니다. 당신이 좋아하는 것을 정확하게 발견하고 책, 기사 및 기타를 삼키기 시작하고 가장 중요한 것은 읽은 모든 것을 연습하는 것이 좋습니다. 그것은 결국 차이를 만들 것입니다.
      감사합니다,

  6.   아이첸

    안녕하세요.
    이 주제를 설명하고 추가 정보를 위해 "The Shellcoder 's Handbook"이 있다고 언급 해 주셔서 감사합니다. 이미 보류중인 읽기가 있습니다 😉