이전 학습 ↓
카나리 생성 과정
카나리 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장된다
TLS에 카나리 값이 저장되는 과정을 분석해보자
fs는 TLS를 가리키므로 fs 값만 알면 TLS 주소를 알 수 있다
하지만 리눅스에서 fs 값은 특정 시스템 콜을 사용해야만 조회 가능하다
그래서 fs 값을 설정할 때 호출되는 arch_prctl(int code, unsigned long addr) 시스템 콜에 중단점을 설정한다
catch 명령어는 특정 이벤트가 발생했을 때, 프로세스를 중지시킨다
arch_prctl에 catchpoint를 설정하고 canary를 실행한다
init_tls() 안에서 catchpoint에 도달할 때까지 countinue 명령어 실행
rdi 값이 0x1002이며, 이 값은 ARCH_SET_FS의 상숫값이다
rsi 값이0x7ffff7fa8740이므로, 이 프로세스는 TLS를 0x7ffff7fa8740에 저장할 것이다
카나리가 저장될 fs+0x28 (0x7ffff7fa8740 + 0x28) 값에는 아직 어떠한 값도 설정되어 있지 않음
(리눅스는 TLS의 0x28 오프셋에 카나리를 저장함)
TLS+0x28에 값을 쓸 때 프로세스를 중단시킨다
watch는 특정 주소에 저장된 값이 변경되면 프로세스를 중단시키는 명령어다
watchpoint를 설정하고 프로세스를 진행시키면 security_init 함수에서 프로세스가 멈춘다
여기서 TLS+0x28의 값을 조회하면 카나리가 설정된 것을 확인 가능
실제로 이 값이 main 함수에서 사용하는 카나리값인지 확인하기 위해
main 함수에 중단점 설정하고 진행
rax 값을 확인해보면 security_init에서 설정한 값과 같은 것을 확인 가능(0x33225375db8eb500)
'시스템 해킹 > 학습' 카테고리의 다른 글
[시스템] Return to Shellcode (카나리 우회) (0) | 2025.01.03 |
---|---|
[시스템] 스택 카나리 우회(Canary) (0) | 2025.01.03 |
[시스템] 스택 카나리 분석(Canary) (0) | 2025.01.02 |
[시스템] (스택) 버퍼 오버플로우 (0) | 2024.08.26 |
[시스템] 함수 호출 규약 (SYSV) (0) | 2024.08.22 |