촉촉한초코칩

[Dreamhack] Canary 실습 동적 분석 본문

Study/System

[Dreamhack] Canary 실습 동적 분석

햄친구베이컨 2024. 5. 19. 10:54

https://learn.dreamhack.io/112#3

 

로그인 | Dreamhack

 

dreamhack.io

 

카나리 정적 분석

 

  • 스택 버퍼 오버플로우 존재
  • 카나리를 활성화하여 컴파일한 바이너리와, 비활성화하여 컴파일한 바이너리를 비교하여 스택 카나리 원리를 살펴본다.

 

카나리 비활성화

  • 컴파일 옵션으로 -fno-stack-protector 옵션을 추가해야 카나리 없이 컴파일할 수 있다.

  • 실행하려고 했는데.. 버퍼오버플로우 위험이 있다고 실행이 안 되는 것 같음.....
  • 드림핵 기준으로 정리하면.. 
    • 길이가 긴 입력을 주면 반환 주소가 덮여서 Segmentation fault가 발생할 수 있다.

 

카나리 활성화

  • 긴 입력을 주면 stack smashing detected와 Aborted라는 에러가 발생 : 스택 버퍼 오버플로우가 탐지되어 프로세스가 강제 종료되었음을 의미함
  • 카나리 비활성화와 디스어셈블 결과를 비교하면 main 함수의 프롤로그와 에필로그에 코드가 추가된 것을 볼 수 있다. 

canary.asm > no_canary.asm

 

카나리 동적 분석  

 

카나리 저장

  • 추가된 프롤로그의 코드에 중단점을 설정하고 바이너리를 실행시킨다.
  • main+8fs:0x28의 데이터를 읽어서 rax에 저장한다.
  • fs : 세그먼트 레지스터로, 리눅스는 프로세스가 시작될 때 fs:0x28에 랜덤 값을 저장한다.
  • main+8의 결과로 rax에는 리눅스가 생성한 랜덤 값이 저장된다.

  • 코드를 한 줄 실행하면 rax의 첫바이트에는 널바이트인 8바이트 데이터가 저장되어 있다. 

  • 생성한 랜덤 값은 main_17에서 rbp-0x8에 저장된다.

 

카나리 검사

  • 추가된 에필로그의 코드에 breakpoint를 설정하고 바이너리를 계속 실행시킨다.
  • main+50rbp-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