Codegate 2018 BaskinRobins31

·2022년 11월 9일
0

앞서 정리한 내용을 바탕으로 문제 하나를 풀어보자.

NX-bit와 Partical RELRO가 켜져 있다. ROP 공격을 해 보자.

베스킨라빈스31 게임이다.
그냥 프로그램이 이기도록 설계되어 있다.

프로그램의 코드를 보자.

your_turn() 함수에 남은 숫자가 담긴 변수 주소를 넘기고 호출한다.
your_turn() 함수를 확인해보자.

버퍼에 0xb0만큼 쓰는데 read() 함수에서 입력을 0x190만큼 받으므로, 버퍼 오버플로우가 일어난다.
공격 시나리오는 이렇게 된다.

  1. printf() 주소를 알아내기 위해 puts(printf@got) 를 실행 한다.
  2. pwntools 에서 printf() 오프셋을 구해 printf@gotprintf() 오프셋의 차를 구하여 libc_base 주소를 구한다.
  3. pwntools 에서 system() 오프셋을 구해 libc_base 주소와 system() 오프셋의 합을 구하여 system() 주소를 구한다.

인자 1개를 받는 system() 함수에 필요한 가젯을 구한다.

4번째 것을 쓰면 되겠다.

익스코드를 짜보자.

0개의 댓글