앞서 정리한 내용을 바탕으로 문제 하나를 풀어보자.
NX-bit와 Partical RELRO가 켜져 있다. ROP 공격을 해 보자.
베스킨라빈스31 게임이다.
그냥 프로그램이 이기도록 설계되어 있다.
프로그램의 코드를 보자.
your_turn()
함수에 남은 숫자가 담긴 변수 주소를 넘기고 호출한다.
your_turn()
함수를 확인해보자.
버퍼에 0xb0
만큼 쓰는데 read()
함수에서 입력을 0x190
만큼 받으므로, 버퍼 오버플로우가 일어난다.
공격 시나리오는 이렇게 된다.
printf()
주소를 알아내기 위해 puts(printf@got)
를 실행 한다.printf()
오프셋을 구해 printf@got
와 printf()
오프셋의 차를 구하여 libc_base
주소를 구한다.system()
오프셋을 구해 libc_base
주소와 system()
오프셋의 합을 구하여 system()
주소를 구한다.인자 1개를 받는 system()
함수에 필요한 가젯을 구한다.
4번째 것을 쓰면 되겠다.
익스코드를 짜보자.