[2018_Sharif_CTF] Crashed DB(50)

Updated:

Exercise

We lost some data when we were delivering our DB. Can you recover it?? Hint: SQLite

[그림] exercise

Solution

Forensic 첫번째 문제, DB 전송 과정에서 일부 데이터를 손실했으며, 이를 복구할 수 있는지 묻고 있다. SQLite 가 hint로 주어진 것을 보아, sqlite db 관련 문제임을 확인.

sqlite3 를 통해, 해당 binary를 읽어보면, db 정보가 전혀 식별되지 않는 것을 확인할 수 있으며 table 조회 시, error를 볼 수 있다.

jsh05042@Macs-MacBook-Pro  ~/Desktop/CTF/2018_Sharif_CTF/Forensic/50_Crashed DB
 sqlite3 ./db0.db
SQLite version 3.16.0 2016-11-04 19:09:39
Enter ".help" for usage hints.
sqlite> .dbinfo
database page size:  0
write format:        0
read format:         0
reserved bytes:      0
file change counter: 0
database page count: 0
freelist page count: 0
schema cookie:       0
schema format:       0
default cache size:  0
autovacuum top root: 0
incremental vacuum:  0
text encoding:       0
user version:        0
application id:      0
software version:    0
number of tables:    0
number of indexes:   0
number of triggers:  0
number of views:     0
schema size:         0
sqlite> .table
Error: file is encrypted or is not a database

binary 확인 시, signature를 포함한 header 정보가 날아가 있는 것을 확인할 수 있다.

[그림] Header information

적당한, sqlite db 파일을 하나 만들고 db0.db의 0번째 offset 인 0x0D 로 구분되는 지점까지의 header offset을 가져다 넣어준다.

[그림] tmp Header

[그림] fixed Header

remake 한 db 파일의 정보를 확인하여, table 정보를 식별하려 하면, 아래와 같은 error message를 확인할 수 있다.

 jsh05042@Macs-MacBook-Pro  ~/Desktop/CTF/2018_Sharif_CTF/Forensic/50_Crashed DB
 sqlite3 ./remake_db0.db
SQLite version 3.16.0 2016-11-04 19:09:39
Enter ".help" for usage hints.
sqlite> .dbinfo
database page size:  1024
write format:        1
read format:         1
reserved bytes:      0
file change counter: 1
database page count: 2
freelist page count: 0
schema cookie:       1
schema format:       4
default cache size:  0
autovacuum top root: 0
incremental vacuum:  0
text encoding:       1 (utf8)
user version:        0
application id:      0
software version:    3008004
number of tables:    0
number of indexes:   0
number of triggers:  0
number of views:     0
schema size:         0

sqlite> .table
Error: database disk image is malformed

Error 정보를 확인해보면, page 와 관련이 있었다. 주어진 db 의 크기는 8kb size를 가진다. 아래와 같이 page의 크기를 0x1000 (4096) 으로 명시하고, 하나의 page 크기가 0x1000일 때, 해당 db는 8kb 이므로 2 page로 구성된다. 따라서 offset을 0x02로 수정한다.

[그림] fixed Header Offset

이후, table과 table schema를 정상적으로 식별할 수 있었다.

sqlite> .schema
CREATE TABLE tbl (Glaf varchar(15), Flag varchar(1), Lfag varchar(15));

sqlite> .table
tbl

tbl이라는 table 내에서 Flag라는 column을 하나 확인할 수 있는데 해당 정보를 출력하면 flag를 확인할 수 있다.

✘ jsh05042@Macs-MacBook-Pro  ~/Desktop/CTF/2018_Sharif_CTF/Forensic/50_Crashed DB
 sqlite3 ./remake_db0.db
SQLite version 3.16.0 2016-11-04 19:09:39
Enter ".help" for usage hints.
sqlite> select Flag from tbl;
S
h
a
r
i
f
C
T
F
{
7
d
9
e
d
4
a
5
8
6
7
f
6
b
d
3
7
6
9
2
8
a
3
e
d
7
8
3
7
a
0
7
}
sqlite>

SharifCTF{7d9ed4a5867f6bd376928a3ed7837a07}

Leave a comment