system 함수에 값을 넣어줄 때 그냥 name배열에 "/bin/sh"넣고 name배열 주소 넣어주면 안되고 name배열에 name+4의 주소 + "/bin/sh"를 넣어주어야 하는지 이유를 모르겠습니다ㅠ
system() 호출 시 인자로 어떤 주소값이 들어가는지 그리고
name+4가 어떤식으로 활용되는지를 gdb로 분석해보시면 쉽게 아실 수 있을 것 같습니다.
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"이므로 정상 실행되는 것입니다.