이것은 실제로 ctf 게임입니다. hackcenter.com의 Enigma 2017 연습 우리는 ext3에서 삭제된 파일을 복구해야 합니다. 나는 팔로우하고 있다이 튜토리얼.
아이노드는 1036이다. istat는 그룹 0을 제공합니다.
fsstat undelete.img
Group: 0:
Inode Range: 1 - 1280
...
Inode Table: 24 - 183
...
이제부터 노드 테이블의 크기는 160블록이며 각각 8개의 inode가 있습니다. Inode 1036은 블록 153에 위치하며 4번째 항목입니다.
이 확인되었습니다
debugfs -R 'imap <1036>' undelete.img
debugfs 1.43.4 (31-Jan-2017)
Inode 1036 is part of block group 0
located at block 153, offset 0x0180
jls undelete.img | grep 153$
46: Unallocated FS Block 2153
206: Unallocated FS Block 153
214: Unallocated FS Block 153
224: Unallocated FS Block 153
680: Unallocated FS Block 4153
jcat undelete.img 8 206 | dd bs=128 skip=3 count=1 | xxd
1+0 records in
1+0 records out
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
128 bytes copied, 0,00719467 s, 17,8 kB/s
jcat undelete.img 8 214 | dd bs=128 skip=3 count=1 | xxd
1+0 records in
1+0 records out
00000000: a481 0000 2000 0000 4d70 8b58 4d70 8b58 .... ...Mp.XMp.X
00000010: 4d70 8b58 0000 0000 0000 0100 0200 0000 Mp.X............
00000020: 0000 0000 0100 0000 ef08 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 17ea 60e7 0000 0000 0000 0000 ......`.........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
128 bytes copied, 0,00714798 s, 17,9 kB/s
jcat undelete.img 8 224 | dd bs=128 skip=3 count=1 | xxd
1+0 records in
1+0 records out
00000000: a481 0000 0000 0000 4d70 8b58 4d70 8b58 ........Mp.XMp.X
00000010: 4d70 8b58 4d70 8b58 0000 0000 0000 0000 Mp.XMp.X........
00000020: 0000 0000 0100 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 17ea 60e7 0000 0000 0000 0000 ......`.........
128 bytes copied, 0,00556548 s, 23,0 kB/s
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
내가 얻는 유일한 직접 블록 포인터는 0x8ef
offset 입니다 40
. 블록 크기는 로 보고됩니다 fsstat
. 하지만
dd bs=1024 skip=2287 count=1 if=undelete.img | xxd
그냥 0을 제공합니다.
나는 무엇이 잘못되었는지 모른다.
답변1
혹시 파일 시스템 이미지의 URL을 언급하지 않으셨는데, hackcenter.com에 등록하신 후 찾는 것은 어렵지 않습니다. (여기서 URL을 반복하지 않겠습니다).
맹목적으로 레시피를 따르는 대신, 이미지를 보고 무엇을 기대하는지 알아봅시다. fls
등의 이름을 가진 파일이 여러 개 있다는 것을 알 수 있는데 filler-0
, 이후에는 하나의 파일이 삭제되었습니다.filler-1
filler-1023
key
제출물을 찾는 중
jls undelete.img | grep Commit
...
228: Unallocated Commit Block (seq: 9, sec: 1485533263.2387673088)
...
이것이 9
마지막 커밋인 것으로 나타났습니다. 커밋 전에 무슨 일이 일어났는지 살펴보겠습니다. (블록 번호를 주석 처리했습니다.)
205: Unallocated FS Block 3112
206: Unallocated FS Block 153 # our inode
207: Unallocated FS Block 3113 # data
208: Unallocated FS Block 3114 # data
209: Unallocated FS Block 3115 # data
210: Unallocated Commit Block (seq: 7, sec: 1485533262.1970733056)
211: Unallocated Descriptor Block (seq: 8)
212: Unallocated FS Block 23 # inode bitmap
213: Unallocated FS Block 2 # group desc
214: Unallocated FS Block 153 # our inode blk
215: Unallocated FS Block 24 # first inode blk
216: Unallocated FS Block 5118
217: Unallocated FS Block 22 # data bitmap
218: Unallocated FS Block 3116 # data
219: Unallocated Commit Block (seq: 8, sec: 1485533262.2227109888)
220: Unallocated Descriptor Block (seq: 9)
221: Unallocated FS Block 5118
222: Unallocated FS Block 24 # first inode blk
223: Unallocated FS Block 1 # super blk
224: Unallocated FS Block 153 # our inode blk
225: Unallocated FS Block 22 # data bitmap
226: Unallocated FS Block 2 # group desc
227: Unallocated FS Block 23 # inode bitmap
228: Unallocated Commit Block (seq: 9, sec: 1485533263.2387673088)
229: Unallocated FS Block Unknown
따라서 커밋 #7에서는 inode 블록과 세 개의 데이터 블록이 기록됩니다. 커밋 #8에서는 일부 inode 할당 및 터치가 이루어지고 개별 데이터 블록이 기록됩니다. 커밋 #9에서는 거의 동일하지만 데이터 블록이 기록되지 않습니다.
filler
따라서 커밋 #7에서는 마지막 파일이 생성되는 것을 볼 수 있고, 커밋 #8에서는 key
파일이 생성되어 기록되고, 커밋 #9에서는 다시 삭제되는 것으로 추측됩니다 .
이제 로그에 있는 inode 블록 153의 복사본을 살펴보겠습니다. 224(삭제 후 inode) 및 206(생성 전 inode)에는 직접 블록 포인터의 빈 목록이 있습니다. 214를 보면 무슨 일이 일어나고 있는지 모르겠지만 다음과 같은 결과를 얻습니다.
$ jcat undelete.img 8 214 | dd bs=128 skip=3 count=1 | xxd
00000000: a481 0000 2000 0000 4e70 8b58 4e70 8b58 .... ...Np.XNp.X
00000010: 4e70 8b58 0000 0000 0000 0100 0200 0000 Np.X............
00000020: 0000 0000 0100 0000 2c0c 0000 0000 0000 ........,.......
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 8682 a674 0000 0000 0000 0000 .......t........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
따라서 의 즉각적인 블록 목록에는 이전에 추측한 대로 또는 에 블록이 0x28
있습니다 .0x0c2c
3116
몇 가지 사항을 살펴봄으로써 우리가 이탈하지 않았는지 확인해 보겠습니다.
$ fcat filler-1022 undelete.img
f1755813fae6d0f542f962f50ff37184
$ dd if=undelete.img bs=1024 skip=3114 count=1 2> /dev/null ; echo
f1755813fae6d0f542f962f50ff37184
$ fcat filler-1023 undelete.img
aa08cba3462555833ffed443474bd133
$ dd if=undelete.img bs=1024 skip=3115 count=1 2> /dev/null ; echo
aa08cba3462555833ffed443474bd133
네, 짐작대로 이것은 쓰여진 데이터입니다 filler
. 그러면 블록에는 무엇이 들어있나요 3116
? 결과는 0입니다. 이는 블록이 업데이트되지 않았음을 의미합니다. 하지만 우리 잡지에는 사본이 있어요. 두 filler
파일의 경우:
$ jcat undelete.img 208
f1755813fae6d0f542f962f50ff37184
$ jcat undelete.img 209
aa08cba3462555833ffed443474bd133
이제 키를 찾는 것이 쉬울 것입니다(명백한 이유로 공개적으로 이 작업을 수행하지는 않겠습니다).