system 함수

system 함수에 값을 넣어줄 때 그냥 name배열에 "/bin/sh"넣고 name배열 주소 넣어주면 안되고 name배열에 name+4의 주소 + "/bin/sh"를 넣어주어야 하는지 이유를 모르겠습니다ㅠ

#pwnable
작성자 정보
답변 2
kimht_
강의 수강: 1

system() 호출 시 인자로 어떤 주소값이 들어가는지 그리고
name+4가 어떤식으로 활용되는지를 gdb로 분석해보시면 쉽게 아실 수 있을 것 같습니다.

2022.07.24. 15:29
이무쿤
대표 업적 없음

const char *와 char []의 차이를 생각하셔야 하는데요
만약 char name[16] = "Hello" 라고 한다면 name으로 할당된 메모리 영역에 "Hello" 문자가 바이트 그대로 들어갑니다.
따라서 name을 수정해도 그 바이트 값이 바뀌는 것으로 수정이 가능하죠.

const char *name = "Hello" 같은 경우는 "Hello"는 name으로 할당된 메모리 영역이 아닌 read only 데이터 영역에 문자열로 저장되고 name은 그 저장된 주소값을 저장하게 됩니다.

system 함수는 인자로 const char * 을 받는 함수이고, 만약 name을 "/bin/sh"로 저장하였다면
system은 const char * 의 데이터 읽는 방식인 name에 저장된 위치를 참조하려 할 것입니다.
하지만 /bin/sh는 주소 값이 아니므로 오류가 발생하게 되겠죠.
따라서 (name주소값 + 4) + "/bin/sh" 을 name에 저장하게 된다면
system은 name 주소 값 + 4에 참조하고자 하는 값이 저장된 것으로 판단하고 찾을 것이고 그 값이 "/bin/sh"이므로 정상 실행되는 것입니다.

2022.08.18. 16:44
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기