촉촉한초코칩
[Dreamhack] Canary 생성 과정 동적 분석 본문
https://learn.dreamhack.io/112#8
카나리 생성 과정
카나리 값은 프로세스가 실행될 때
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 |