system() 호출시 name+4 의 주소로 설정해야 하는 이유

처음에 이 문제를 풀려고 시도 했을 때에는,
name 의 위치에 "/bin/sh"을 위치 시키고 oob를 이용해 name을 참조하는 command 배열을 통해 sh를 획득하려고 했었습니다.

그런데, gdb를 보니, system call 시 eax에 "/bin" 만 들어가 있었습니다.

 EAX  0x6e69622f ('/bin')

그래서 계속 sh을 획득하지 못하는 것처럼 생각이 됩니다.

그래서 여러 정보들을 찾아보니,
name에 name+4 의 address를 넣고, name+4 위치에 "/bin/sh" 을 넣으면 된 다는 사실을 알게 되었습니다.

이렇게 하고 gdb로 분석해 보니, 아래와 같이 eax에 /bin/sh이 제대로 들어가 공격에 성공하였습니다.

 EAX  0x804a0b0 (name+4) ◂— '/bin/sh'

system 함수를 호출할때, 위와 같이 해야 하는 이유에 대해서 질문드립니다.

제가 추론한 것은,
system에 arguement를 넘길때 eax의 주소(char*)를 넘겨 그 주소의 str을 참조하도록 되어있는데,
제가 처음 시도한 방법은 str 자체가 eax에 들어가게 되므로 에러를 일으킨 것인것일까요?

#pwnable
작성자 정보
답변 1
avatar
Dreamhack
대표 업적 없음

안녕하세요,
추론하신대로입니다. system 함수는 문자열 포인터를 argument로 받고, 이 argument 는 문자 값 그대로가 아닌 어떤 문자열을 가리키는 주소값이어야합니다!

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