Wargame/H4CKING GAME

[H4CKING GAME] bof

J4guar 2022. 5. 9. 12:42
728x90
반응형

Mitigation

Vulnerability Analysis

<main>

read와 gets를 통해 입력을 받는데 gets의 경우 입력 size에 대한 제한이 없기 때문에 BOF를 유발할 수 있습니다.

대신 canary가 [rbp-0x8]영역에 존재하기 때문에 이에 대한 검사를 통과해야합니다.

 

Canary Leak

canary의 구조는 \x00 ?? ?? ?? ?? ?? ?? ?? 이렇게 생긴 랜덤한 값이기 때문에  첫 번째 read에서 0x119 size를 입력받아 canary의 1byte인 \x00 임의의 값으로 덮어쓸 수 있습니다.

결국 printf를 통해 [rbp-0x120]의 값을 출력할 때 canary의 1byte가 \x00가 아니라면 canary의 값까지 이어서 출력하도록 유도할 수 있습니다.

canary의 값을 이렇게 얻어냈으면 gets를 통해 BOF를 수행할 수 있습니다.

ROP 사용

이전 Qualification문제와 다르게 shell을 얻을 수 있는 함수가 존재하지 않기 때문에 gadget을 이용해 ROP를 수행하겠습니다.

read의 GOT에 존재하는 read의 address를 puts함수를 이용해 출력하고 다시 메인함수로 돌아가도록 ROP payload를 구성합니다.

여기서 libc파일에 존재하는 read의 주소를 얻을 수 있고 이를 이용해 libc파일의 base address를 구할 수 있습니다.

libc파일의 base address를 기준으로 system과 "/bin/sh"문자열의 주소 또한 구할 수 있습니다.

 

main함수로 돌아가도록 ROP payload를 구성했었기 때문에 gets를 통해 두 번째 payload를 구성할 때엔 system("/bin/sh")이 동작하도록 작성할 수 있습니다.

Result

반응형