6번이랑 별 달라진게 없지만 ret가 갈 주소를 검사하는 부분이 더 엄격해졌다
이젠 6번 처럼 ret에 system함수의 주소를 삽입하는 것도 불가능해 보인다
system의 위치가0xf로 시작하기 때문에
f &(and) b 연산으로 하면 b가나와서 걸리기 때문
이럴 때는
이런식으로 getpath의 ret을 main의 ret주소를 넣어주면
ret를 검사하는 부분에 걸리지 않고 그밑에 system과 /bin/sh로 채울 수 있다
(main문엔 ret를 검사하는 부분도 없고)
이러한 방식을 ROP(Return Oriented Programming)이라고 함
이제 구해야 할 것
buffer에서 ret(getpath)까지의 길이
main의 ret주소
system 주소
/bin/sh 주소
buffer에서 ret까지의 길이 80바이트
main의 ret주소
system의 주소
/bin/sh 의 주소
성공
이건 쉬운문제라 ROP를 한번 밖에 안썼지만
실전은 매우 많이 써야함