파일을 실행해보자
뭔가가 계속 변한다.
IDA로 수도코드를 확인하자
main함수에서 echo함수를 호출하고 echo함수에서 gets를 통해 s를 입력받고 s의 주소값을 출력한다.
위의 실행결과와 코드를 합쳐서 보았을때 s의 주소값이 계속 변하는 것을 알 수 있다.
s의 크기는 238바이트이다.
echo를 disas해서 살펴보면 버퍼의 크기가 0xee인 것을 확인할 수 있다. 이것은 s의 크기이고 따라서 dummy 값이 없음을 알 수 있다.
(다른 방법)
bp1 : echo 함수의 첫번째 명령어 - 최상위 스택의 주소를 구할 수 있고 여기에 return address가 들어있음
bp2 : gets함수를 호출하는 call명령어 - s 주소를 구할 수 있음
bp1에서 구한 주소값은 0xffffd03c이고 bp2에서 구한 주소값은 0xffffcf4a이다.
이 두 주소값의 차는 s에서 return address 까지의 거리이다.
s에서 return address 까지의 거리는 242인데 s의 크기가 238이고 sfp 크기가 4이기 때문에 더미값이 없음을 알 수 있다.
payload는 다음과 같이 작성한다.
dummy값과 쉘코드로 242바이트를 채워주고 return address 영역에 s의 주소로 채워주면 된다.
s의 주소는 계속 변하니깐 recv()로 받아온다.
*recv() : 데이터를 받아옴
쉘코드는 25바이트 쉘코드 사용