NTFS에는 Fix up 이라는게 있다.
N0named의 CTF 문제를 풀면서 다시금 떠올려서 게시글을 작성한다.
우리 이제 그만하자 라는 문제를 풀면서 떠올렸다. 사실 문제 자체는 매우 간단했다. NTFS의 BR이 오염되어 있었고, 이를 고친다면 Flag를 발견할 수 있도록 구성되어있었다. 하지만 맨 처음에는 이를 발견하지 못했고, 그래서 여러 Header 들을 검색해봤다. 예를 들어, jpg의 확장자인 FF D8, PNG인 89 50 .., PNG, ZIP 등등을 말이다. 그러다가 한개의 확장자를 발견했고, 문제의 문구와 제목을 봤을 때 flag 파일을 찾았구나 싶었다.
처음엔, 이걸 그냥 뽑아서 압축 해제하면 되겠지 라고 생각했다.
하지만 CRC 오류가 있는 건가 싶었다. 그래서 Zip 복구 도구로 복구를 해보았고,
Base64로 추정되는 문자열을 발견했다.
하지만 뭔가 이상했다. 압축을 해제했는데, 문자열의 앞부분만이 해제되는게 말이 되나? 절반만은 base32로 Encoding되어 있어서 각각 합치는건가? 여러 생각이 들었고, 일단 이 풀이는 제외하고 다른 풀이를 위해 넘어갔고 원래의 풀이인 파티션 복구를 수행해서 문제를 해결했다.
문제를 푼 후 이 상황이 발생한 이유가 뭔지 찾았고, 답을 알아냈다.
NTFS 복구가 진행된 후의 파일
NTFS 복구 이전 carving된 파일
각각의 중간에 2byte만이 차이가 난다. 왜 그런가? 곰곰히 생각하다가, Fixup을 내가 누락한 것임을 깨달았다.
본론이다.
Fixup이란 NTFS에서 Sector의 끝 부분에 오류 검사를 위해 넣어두는 기능을 의미한다.
색이 존재하는 각 부분 순서의 의미는 다음과 같다.
위치 | 의미 |
---|---|
4-5 | Offset to fixup arry, 0x30이 Default |
6-7 | Number of entries in fixup arry, 0x03이 Default |
48-49 | Signature(Fixup value), Offset to fixup arry에 따라 위치가 변함. 다만 0x30이 Default |
50-51 | Fixup arry 1 |
52-53 | Fixup arry 2 |
53-54 | Fixup arry 3 |
그니까, 한 파일을 저장하는데에 있어 Sector의 끝 부분에 집어넣는, 값을 의미한다. 아무 NTFS를 붙잡고 Sector의 끝부분을 유심히 관찰하다보면, 일정한 값이 반복됨을 알 수 있다. 예시 Case의 경우 0x03 00이다.
아무튼 그래서,만약에 내가 복구하려고 한 파일의 중간에 Sector의 끝부분이, 다시말해 Fixup이 껴있다면, 저 위치에 69 6D를 집어넣어야 복구가 되는 것이다.
N0named의 CTF 풀이의 경우도 마찬가지다. Zip의 중간에 Fixup이 껴있으니, 그걸 잘 집어넣어야한다.
안녕하세요 혹시 대학원 다니시나요?