bof

oogu ㅣ 2023. 2. 15. 20:33

[그림 1-1]

PIE가 안걸려있다. -> code, data 영역 고정됨

[그림 1-2]

실행하면 what's ... 문자열 출력 후 사용자 입력을 받고 사용자가 입력한 문자열을 출력해 준다.

다음으로 , send ... 문자열 출력 후 두 번째 사용자 입력을 받는다.

gdb로 뜯어보자

[그림 1-3]

[그림 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 버전을 찾는 방향으로 해보자

[그림 1-4]
[그림 1-5]

카나리 leak이 잘 된다.

[그림 1-6]
[그림 1-7]

각 함수(puts, read, printf) 라이브러리 주소를 잘 받아온다. 

remote에서 받아와 라이브러리 버전을 확인하자!

 

[그림 1-8]

 

[그림 1-9]

두 버전이 떴다. 

[그림 2-1]

확인해 보면 두 버전 offset은 같다.

[그림 2-1] 정보를 통해 이제 system함수를 실행시킬 수 있다.

 

문제는 gets 함수를 실행하기 전까지는 libc base 주소를 알 수 없어 system 함수를 넣을 수 없다.

즉, gets 함수가 실행된 후 system 함수를 사용할 수 있는데 gets 함수가 끝나면 입력을 할 수가 없다.

이때, ret2main 기법을 활용해보자

[그림 2-2]

익스가 안돼서 ret 가젯을 추가했다.

[그림 2-3]

성공!

 

rop기법에 두려움이 있었는데 좀 극복이 됐다..

'h4cking game' 카테고리의 다른 글

Qualification  (0) 2023.02.15