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).
무엇이 답이라고 생각하십니까? –
잘 모르겠다 ... – user133466
이것은 일반적인 C 프로그래밍 클래스인가? –