2010-01-11 2 views
1

C 프로그래밍을위한 실습 문제로 작업 중이며이 문제가 발생했습니다. xDEADBEEF가 정지 명령이라는 점을 감안할 때 질문이 무엇인지 묻는 것이 확실하지 않지만 deadbeef를 어디에 주입합니까? FP가이 질문과 관련이있는 이유는 무엇입니까? 고맙습니다!프레임 포인터/프로그램 카운터/배열 오버플로

당신은 목성의 행성 간 우주 임무에서 컴퓨터 엔지니어로 일했습니다. 우주에서 몇 개월 만 지나면 우주선의 메인 컴퓨터 인 HAL9000이 오작동하기 시작하고 승무원들을 죽이기 시작합니다. 마지막으로 살아남은 승무원이고, HAL 9000 컴퓨터를 속여서 HALT 명령을 실행해야합니다. 좋은 소식은 halt 명령의 기계어 코드가 xDEADBEEF (십진수로, 이것은 -559,038,737 임)임을 (16 진수로) 알고 있다는 것입니다. 나쁜 소식은 HAL 9000 운영 체제가 실제로 실행하고자하는 유일한 프로그램은 체스입니다. 다행히도, 우리는 체스 프로그램의 소스 코드에 대한 상세한 인쇄물을 가지고 있습니다 (모든 중요한 부분의 발췌 부분은 아래에 나와 있습니다). getValues ​​함수는 0이 아닌 정수를 읽고 각 숫자를 배열 x에 순서대로 저장합니다. 프로그램의 원래 작성자는 명백하게 두 개의 양수를 제공 할 것을 기대했지만 프로그램에 세 개 이상의 숫자를 입력하는 것을 막을 수있는 것은 아무것도 없습니다. 우리는 또한 스택은 8000과 8999 사이의 메모리 위치를 사용하는 것으로, 초기 프레임 포인터 값이 키보드에서 입력해야하는 번호를 어떤 순서 8996.

void getValues(void) { 
    int x[2]; // array to hold input values 
    int k = 0; 
    int n; 
    n = readFromKeyboard(); // whatever you type on the keyboard is assigned to n 
    while (n != 0) { 
    x[k] = nextNumber; 
    k = k + 1; 
    n = readFromKeyboard();// whatever you type on the keyboard is assigned to n 
    } 
    /* the rest of this function is not relevant */ 
} 

int main(void) { 
    int x; 
    getValues(); 
    /* the rest of main is not relevant */ 
} 

가를 실행하는 컴퓨터를 강제로 할 것이라는 점을 알고있다 명령을 중단 하시겠습니까?

SAMPLE 솔루션

One of the first three numbers should be -559038737. The fourth number must be the address of where 0xdeadbeef was placed into memory. Typical values for the 4th number are 8992 (0xdeadbeef is the second number) or 8991 (0xdeadbeef is first number). 
+0

무엇이 답이라고 생각하십니까? –

+0

잘 모르겠다 ... – user133466

+0

이것은 일반적인 C 프로그래밍 클래스인가? –

답변

2

은 입력이 넘쳐서이되어 반환 주소로 덮어 쓴 일련의 명령어로 되돌아갑니다.

문제

는 여기있다 :

int x[2]; // array to hold input values 

에 3 개 이상의 값을 전달함으로써, 당신은 당신이 안 메모리를 덮어 쓸 수 있습니다. 샘플 예를 설명 :

  1. 먼저 입력 -559,038,737 풋 xDEADBEEF 메모리에
  2. 두 번째 입력 -559,038,737, 왜 안합니다.
  3. 세 번째 숫자 -559,038,737은 아프지 않습니다.
  4. 네 번째 숫자 8992는 함수가 반환하려는 주소입니다.

함수 호출이 반환되면 (8992)를 사용하여 스택의 반환 주소를 덮어 쓴 주소로 돌아갑니다.

실제 버퍼 오버플로 해킹 작업 slike이 : 오버 플로우 가능성이있는

  1. 찾기 코드

    여기에 몇 가지 편리한 리소스 및 발췌 한 것입니다.

  2. 실행할 코드를 버퍼 (즉, 스택)에 넣습니다.

  3. 방금 ​​보낸 주소와 동일한 코드 으로 반송 주소를 지정하십시오.

또한 스택 및 전화 프로 시저가 엉망인 경우이 주제에 대한 좋은 책은 "Hacking: The art of exploitation"입니다.

귀하의 경우 입력에 전달 된 정수로 지침을 인코딩하려고합니다.

An article on buffer overflowing

+0

나는 당신을 사랑합니다! – user133466

+0

@metashockwave, 내 사실을 확인하십시오! 아침 5시 44 분에 영국에서 나는 잤다;) –