(가상머신 부팅 스크립트)
//소스코드 컴파일
gcc exploit2.c -o ./exploit2 -lmnl -lnftnl
nft_osf_eval
함수에 break point를 걸고 관찰합니다.
data leak이 일어나는 sprintf
에서의 디버깅 결과입니다. 초기화되지 않은 data
구조체 변수의 .genre
, .version
필드에는 각각 0xffffc90000003b80
, 0xffff888006c5d6c8
주소가 들어있고, %s:%s
포멧 스트링에 의해 leak되는 값은 이 주소 안의 값이라는 것을 알 수 있습니다.
0xffffc90000003b80
을 보았을 때 0xffffc90000003ba0
주소에 커널 스택 주소, 0xffffc90000003ba8
에 커널 코드 주소가 들어있으므로 각각 SFP, RET임을 예상할 수 있습니다.
이 함수는 check_preempt_curr
을 호출하고 0xffffc90000003b90
주소에 check_preempt_curr + 55
영역의 주소가 있는 것으로 보아
0xffffc90000003b80
에 들어있는 값은 함수 resched_curr
의 stack frame안의 값이라는 것을 알 수 있습니다.