일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- vtable
- _IO_FILE
- DFB
- HackCTF
- ROP
- 나뭇잎 책
- Android
- tcache
- UAF
- K-shield Junior
- Lazenca
- srop
- heap
- heap exploit
- malware
- DFC 2022
- Reversing
- BOF
- _IO_FILE Arbitrary Address Read
- master canary
- seccomp
- RTL
- GOT overwrite
- shellcode
- heap feng shui
- __environ
- DreamHack
- H4CKING GAME
- Dynamic Analysis
- _IO_FILE Arbitrary Address Write
- Today
- Total
Studying Security
[H4CKING GAME] bof 본문
Mitigation
Vulnerability Analysis
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
'Wargame > H4CKING GAME' 카테고리의 다른 글
[H4CKING GAME] apple pie (0) | 2022.05.09 |
---|---|
[H4CKING GAME] Qualification (0) | 2022.05.09 |