촉촉한초코칩
[Dreamhack] Canary 실습 동적 분석 본문
https://learn.dreamhack.io/112#3
카나리 정적 분석
- 스택 버퍼 오버플로우 존재
- 카나리를 활성화하여 컴파일한 바이너리와, 비활성화하여 컴파일한 바이너리를 비교하여 스택 카나리 원리를 살펴본다.
카나리 비활성화
- 컴파일 옵션으로 -fno-stack-protector 옵션을 추가해야 카나리 없이 컴파일할 수 있다.
- 실행하려고 했는데.. 버퍼오버플로우 위험이 있다고 실행이 안 되는 것 같음.....
- 드림핵 기준으로 정리하면..
- 길이가 긴 입력을 주면 반환 주소가 덮여서 Segmentation fault가 발생할 수 있다.
카나리 활성화
- 긴 입력을 주면 stack smashing detected와 Aborted라는 에러가 발생 : 스택 버퍼 오버플로우가 탐지되어 프로세스가 강제 종료되었음을 의미함
- 카나리 비활성화와 디스어셈블 결과를 비교하면 main 함수의 프롤로그와 에필로그에 코드가 추가된 것을 볼 수 있다.
canary.asm > no_canary.asm
카나리 동적 분석
카나리 저장
- 추가된 프롤로그의 코드에 중단점을 설정하고 바이너리를 실행시킨다.
- main+8은 fs:0x28의 데이터를 읽어서 rax에 저장한다.
- fs : 세그먼트 레지스터로, 리눅스는 프로세스가 시작될 때 fs:0x28에 랜덤 값을 저장한다.
- main+8의 결과로 rax에는 리눅스가 생성한 랜덤 값이 저장된다.
- 코드를 한 줄 실행하면 rax의 첫바이트에는 널바이트인 8바이트 데이터가 저장되어 있다.
- 생성한 랜덤 값은 main_17에서 rbp-0x8에 저장된다.
카나리 검사
- 추가된 에필로그의 코드에 breakpoint를 설정하고 바이너리를 계속 실행시킨다.
- main+50은 rbp-8에 저장한 카나리를 rcx로 옮긴다.
- main+54에서 rcx를 fs:0x28에 저장된 카나리와 xor한다.
- 두 값이 동일하면 연산 결과가 0이 되면서 je의 조건을 만족하게 되고, main 함수는 정상적으로 반환된다.
- 하지만 두 값이 동일하지 않으면 __stack_chk_fail이 호출되면서 프로그램이 강제 종료된다.
- 여기서는 16개의 H를 입력으로 카나리를 변조하고, 실행 흐름이 어떻게 되는지 살펴본다.
- 코드를 한 줄 실행시키면, rbp-0x8에 저장된 카나리 값이 버퍼 오버플로우로 인해 "0x484848.."이 된 것을 확인할 수 있다.
- main+54의 연산 결과가 0이 아니므로 main+65의 __stack_chk_fail을 실행하게 된다.
- 해당 함수가 실행되면 프로세스가 강제로 종료된다.
'Study > System' 카테고리의 다른 글
[Dreamhack] ssp_001 writeup (0) | 2024.05.19 |
---|---|
[Dreamhack] Canary 생성 과정 동적 분석 (0) | 2024.05.19 |
[Dreamhack] shell_basic (**다시 해보기...) (0) | 2024.05.13 |
(**) BombLab 4 (0) | 2024.05.09 |
[Dreamhack] basic_exploitation_001 (0) | 2024.03.31 |