PIE가 안걸려있다. -> code, data 영역 고정됨
실행하면 what's ... 문자열 출력 후 사용자 입력을 받고 사용자가 입력한 문자열을 출력해 준다.
다음으로 , send ... 문자열 출력 후 두 번째 사용자 입력을 받는다.
gdb로 뜯어보자
[그림 1-3]을 보면
1. puts - what's ... 문자열 출력
2. read(0,[rbp-0x120],0x119)
3. printf("%s, Send your comment : ",[rbp-0x120])
4. gets([rbp-0x110])
카나리 값은 rbp-0x8에 위치하는데 2번 read를 통해 카나리 값까지 접근이 가능하다. -> 카나리 leak
info functions을 통해 함수를 찾아봐도 win이나 get_shell 같은 함수가 보이지 않는다... 따라서 libc에 있는 system을 실행 시켜야 하는데 코드에서 libc 주소를 leak 할 부분이 없다..
따라서 ROP를 이용해 got 주소를 leak해서 remote libc 버전을 찾는 방향으로 해보자
카나리 leak이 잘 된다.
각 함수(puts, read, printf) 라이브러리 주소를 잘 받아온다.
remote에서 받아와 라이브러리 버전을 확인하자!
두 버전이 떴다.
확인해 보면 두 버전 offset은 같다.
[그림 2-1] 정보를 통해 이제 system함수를 실행시킬 수 있다.
문제는 gets 함수를 실행하기 전까지는 libc base 주소를 알 수 없어 system 함수를 넣을 수 없다.
즉, gets 함수가 실행된 후 system 함수를 사용할 수 있는데 gets 함수가 끝나면 입력을 할 수가 없다.
이때, ret2main 기법을 활용해보자
익스가 안돼서 ret 가젯을 추가했다.
성공!
rop기법에 두려움이 있었는데 좀 극복이 됐다..
'h4cking game' 카테고리의 다른 글
Qualification (0) | 2023.02.15 |
---|