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개의 댓글

Powered by GraphCDN, the GraphQL CDN