신기한 Lobsters · 4일 전

윈도우 7 블루스크린 원인 찾다가 발견한 의문의 코드 '0xABADBABE'의 정체

핵심 요약
  • 개발자가 윈도우 7 부팅 중 발생하는 블루스크린을 디버깅하던 중, 시스템이 레지스터에 '0xABADBABE'라는 의문의 16진수 값을 기록하는 것을 발견했습니다.
  • 블루스크린의 원인으로 의심해 바이너리까지 뜯어보며 추적했으나, 사실 윈도우가 디버거용 중단점으로 쓰기 위해 의도적으로 남긴 '가짜 단서(Red Herring)'였습니다.
  • 실제 블루스크린은 메모리 매핑 범위를 벗어난 가상 장치의 포인터 버그 때문이었으며, 해당 매직 넘버 쓰기는 시뮬레이션에서 허용 처리하여 해결되었습니다.
요약 유명 오픈소스 개발자 다니엘 스텐베리(Daniel Stenberg)가 과거 인텔로 추정되는 고객사에서 x86 전체 시스템 시뮬레이션 소프트웨어를 개발하던 시절 겪은 기묘한 디버깅 일화입니다. 당시 그는 가상으로 구현한 USB 디스크 장치 때문에 윈도우 7 부팅 도중 블루스크린이 발생하는 심각한 버그를 추적하고 있었습니다. 문제를 파헤치던 중, 그는 윈도우 7이 블루스크린이 뜨기 불과 10밀리초 전에 EHCI(USB 2.0 컨트롤러)의 예약된 레지스터 영역(인덱스 0x1C)에 뜬금없이 '0xABADBABE(A Bad Babe, 나쁜 가시나)'라는 16진수 매직 넘버를 기록한다는 사실을 발견했습니다. 시뮬레이션 USB 디스크를 꽂지 않으면 이 기록이 발생하지 않았고, 부팅 후 나중에 USB를 꽂아도 어김없이 동일한 값이 쓰여졌기에 그는 이 동작이 시뮬레이션 코드 결함이자 블루스크린의 직접적인 원인이라고 굳게 믿었습니다. 그는 갓 설치한 윈도우 7 파일 시스템(약 20GB) 전체에서 리틀 엔디언 방식으로 이 32비트 패턴을 검색(bgrep)해 무려 16곳에서 동일한 패턴을 찾아냈습니다. 그리고 해당 바이너리를 분석하기 위해 직접 자르기 도구(bcut)까지 만들어 역어셈블러(objdump)로 코드를 뜯어보며 왜 이런 명령어가 실행되는지 원인을 추적했습니다. 하지만 진실은 허탈했습니다. 지인의 도움을 통해 확인한 결과, 윈도우는 USB 장치가 연결되어 있을 때 디버거를 위한 일종의 중단점(브레이크포인트) 역할을 제공하려고 의도적으로 '0xABADBABE' 값을 기록하고 있던 것이었습니다. 즉, 블루스크린과는 아무런 관련이 없는 완벽한 '가짜 단서(Red Herring)'였던 셈입니다. 실제 블루스크린의 진짜 원인은 가상 장치 버그로, 컨트롤러가 채운 USB 데이터 구조체에 드라이버가 매핑한 메모리 영역 밖을 가리키는 포인터가 들어가면서 발생한 문제였습니다. 결국 허무하게 개발자를 낚았던 '0xABADBABE'는 시뮬레이션이 해당 레지스터 쓰기를 허용하도록 예외 처리하는 것으로 일단락되었습니다.
해외 반응 번역
이런 개발 비하인드 스토리 정말 좋아합니다! 저도 예전에 정품 3.5인치 플로피 디스크를 몰래 인증하려고 '0xA340B747'이라는 매직 넘버를 쓴 적이 있었죠. 그 당시 에어버스와 보잉의 대표 기종 경쟁에서 영감을 얻었었네요! 그나저나 위키피디아 헥스스피크나 매직 넘버 항목에는 0xabadbabe의 이런 구체적인 용례가 안 나와 있던데, 언젠가 누군가에게 도움이 될지도 모르겠네요 😉
Sponsored · 광고