촉촉한초코칩

[Dreamhack] Canary 생성 과정 동적 분석 본문

Study/System

[Dreamhack] Canary 생성 과정 동적 분석

햄친구베이컨 2024. 5. 19. 11:08

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

 

로그인 | Dreamhack

 

dreamhack.io

 

카나리 생성 과정

 

카나리 값은 프로세스가 실행될 때

TLS에 전역 변수로 저장되고

각 함수마다 프롤로그와 에필로그에서 이 값을 참조한다. 

> TLS에 카나리 값이 저장되는 과정을 분석해본다. 

 

TLS의 주소 파악

  • fs는 TLS를 가리키므로, fs의 값을 알면 TLS의 주소를 알 수 있다.
  • 리눅스에 fs의 값은 특정 시스템 콜을 사용해야 조회하거나 설정할 수 있다.
    (info register fs, print $fs로는 알 수 없음)
  • fs의 값을 설정할 때 호출되는 arch_prctl(int code, unsigned long addr) 시스템 콜에 중단점을 설정하여 fs가 어떤 값으로 설정되는지 조사한다. 
    해당 시스템 콜을 arch_prctl(ARCH_SET_FS, addr)의 형태로 호출하면 fs의 값은 addr로 설정된다.
  • gdb에는 특정 이벤트가 발생했을 때 프로세스를 중지시키는 catch 명령어가 있다.
    이 명령어를 사용하여 arch_prctl에 catchpoint를 설정하고 canary를 실행한다.

  • init_tls() 안에서 catchpoint에 도달할 때까지 continue 명령어를 실행한다.
  • catchpoint 에 도달했을 때, rdi의 값이 0x1002인데 이 값은 ARCH_SET_FS의 상수값이다.
    rsi 값이 0x7ffff7d7f740이므로, 프로세스는 TLS를 해당 주소값에 저장할 것이며, fs는 이를 가리키게 된다.
  • 카나리가 저장될 fs+0x28 (0x7ffff7d7f740 + 0x28)의 값을 보면 아직 값이 설정되지 않은 것을 볼 수 있다.

 

카나리 값 설정

  • gdb의 watch 명령어로 TLS+0x28에 값을 쓸 때 프로세스를 중단시킨다.
    watch는 특정 주소에 저장된 값이 변경되면 프로세스를 중단시킨다.

  • watchpoint를 설정하고 프로세르르 계속 실행시키면 security_init 함수에서 프로세스가 멈춘다.
  • 여기서 TLS+0x28의 값을 조회하면 0x8ab7f53277873d00이 카나리로 설정된 것을 확인할 수 있다.

  • 이 값이 main 함수에서 사용하는 카나리 값인지 확인하기 위해 main 함수에 중단점을 설정하고 계속 실행시킨다.

  • mov rax, QWORD PTR fs:0x28을 실행하고 rax 값을 확인해보면 security_init에서 설정한 값과 같은 것을 확인할 수 있다.

'Study > System' 카테고리의 다른 글

[Dreamhack] **Return to Library  (0) 2024.05.26
[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