[Writeup] [CLGT CTF] Crypto (100)

Standard

Lời nói đầu

Đề bài

crypto100.bin
Hint 1: the boss like to write down his secret in plaintext and do some magic to hide it !
Hint 2: key: xxxxxxxxxxxxxxxxxxx is ...?
Hint 3: Do you know about xortool ?

File dự phòng: http://db.tt/rjo2vb7Q

Nội dung chính

Mở file crypto100.bin dưới dạng text, không có gì khả nghi, ngoại trừ việc các ký tự trong đó (dù vô nghĩa) nhưng tương đối đẹp, và có rất nhiều cụm ký tự lặp lại. Đã nghĩ đến việc XOR byte, nhưng thử với trường hợp XOR 1 byte không mang lại chút ánh sáng nào.

Xem sự phân bố các ký tự:

13-08-2013 14-22-43 13-08-2013 14-22-54

13-08-2013 14-23-01 13-08-2013 14-49-44

Tương tự như vậy đối với các ký tự khác, khiến ta “cảm giác” được rằng dường như có sự nhân bản gì đó trong file. Tiến hành search một đoạn ký tự dài để xác định số lần xuất hiện của nó, ta đi đến kết luận rằng file crypto100.bin chứa một phần nội dung kích thước 5140 byte được lặp lại 20 lần (thành kích thước 102800 byte). Trích xuất 5140 byte đó ra thành file crypto100_.bin, ta sẽ giảm được gánh nặng công việc cho sau này.

Trở lại với XOR, vẫn khó lòng mà từ bỏ hướng đi khả quan này. Ta biết rằng ở  thế giới hiện đại bây giờ, người ta chuộng XOR với một dãy byte, chứ không phải chỉ là 1 byte như hồi còn trẻ con nữa, có mỗi tội là ta không mang đủ công cụ trong tay để hỗ trợ việc tìm ra dãy byte đó mà thôi. Mất 1 ngày không có kết quả.

xortool

Kể từ khi hint này xuất hiện, task trở nên đơn giản hơn rất nhiều. Chạy thử:

python xortool.py ../crypto100_.bin -o

ta được kết quả:

The most probable key lengths:
   2:   12.0%
   5:   14.8%
   8:   10.2%
  10:   15.5%
  12:   8.4%
  15:   9.3%
  18:   6.8%
  20:   9.9%
  25:   6.2%
  30:   6.8%
Key-length can be 5*n
3200 possible key(s) of length 10:
\x0c\x16\x12\x0f\x13\x1a!\x07\x10\r
\x0c\x16\x12\x0f\x13\x1a!\x07N\r
\x0c\x16\x12\x0f\x13\x1a\x7f\x07\x10\r
\x0c\x16\x12\x0f\x13\x1a\x7f\x07N\r
\x0c\x16\x12\x0fM\x1a!\x07\x10\r
...

Ok, hãy vững niềm tin rằng len(key) = 10, và làm một cái vòng lặp với tham số -c chạy từ a đến z xem sao (nếu không được thì ta sẽ bỏ tham số -l đi, và chấp nhận rằng thời gian dò sẽ lâu hơn) emo_popo_smile:

for c in {a..z}
do 
    python xortool.py ../crypto100_.bin -l 10 -c $c
done

Một mớ cực kỳ loằng ngoằng được in ra (nhưng trong Terminal có màu nên cũng không tệ), mình trích phần quan trọng thôi:

32 possible key(s) of length 10:
]GC^BKpVA\\
]GC^BKpV\x1f\\
]GC^BK.VA\\
]GC^BK.V\x1f\\
]GC^\x1cKpVA\\
...
Found 32 plaintexts with 95.0%+ printable characters
See files filename-key.csv, filename-char_used-perc_printable.csv
32 possible key(s) of length 10:
^D@]AHsUB_
^D@]AHsU\x1c_
^D@]AH-UB_
^D@]AH-U\x1c_
^D@]\x1fHsUB_
[...]
Found 32 plaintexts with 95.0%+ printable characters
See files filename-key.csv, filename-char_used-perc_printable.csv
32 possible key(s) of length 10:
SIMPLE~XOR
SIMPLE~X\x11R
SIMPLE XOR
SIMPLE X\x11R
SIMP\x12E~XOR
...
Found 32 plaintexts with 95.0%+ printable characters
See files filename-key.csv, filename-char_used-perc_printable.csv
32 possible key(s) of length 10:
LVROSZaGPM
LVROSZaG\x0eM
LVROSZ?GPM
LVROSZ?G\x0eM
LVRO\rZaGPM
...
Found 32 plaintexts with 95.0%+ printable characters
See files filename-key.csv, filename-char_used-perc_printable.csv
32 possible key(s) of length 10:
MWSNR[`FQL
MWSNR[`F\x0fL
MWSNR[>FQL
MWSNR[>F\x0fL
MWSN\x0c[`FQL
[...]
Found 32 plaintexts with 95.0%+ printable characters
See files filename-key.csv, filename-char_used-perc_printable.csv

Một giá trị rất đẹp đã được tô màu đỏ, và đó chính là thứ ta muốn thấy. Thử decode với key = SIMPLE XOR, ta có file dưới dạng plain text như sau:

3210391-0239-012sda kadaskjdlka21321312
2312312312312nmnm,cxnxz,mccz c211312312ssdasd09-09-09-0mario_-90dasdasdasnmncmcz
czxlkdalskdjas2112 31231 fap fap fap
3123123120391-0293-01293-0192-03912-093-01293-01mario_92-0391-293-01923-0912-0391-0293-09213-091-2093-10293-01293-0192-03912-0390-12
saasdjhasjhdasjkhdaszxbcnxmzbxcmnbxzmncbmzmario_xncbnzmx
ssdkasjmario_paswrodldishidkasden123124jlkdjaslkdjlasdji3upqorp[[afu[siofuspfasoaudfpouppppdwonnnnwoooooohooo
popopopopopoporetretretpopopopopopreteret pop pop ret
for i:=1 to n do
for j:=1 to mario_hellooo do
print helloworld random shit is hard hard hard
testing congratulations this is no joke super secret password is here
hello shekllolasthingtodokas1catiscuriouswhyyounoknow
sdasdjasknannnnnnnnnncczxcxzcz xxczxxjkkljlkjlkjldasdasthisisnonononofunhello
prepare to neptuneeeeeeeee12345 zz
zzzzzzzzzzzzzzzzzzzzzda helloworld12345667
We do not forgive. We do not forget. Expect us . 023-1222-555
key: ae375f18b0c9cb94d0ebfce1aa03bb0367b3631f1d23f5c07e157addd4920dc1 (not flag)
3210391-0239-012sda kadaskjdlka21321312
2312312312312nmnm,cxnxz,mccz c211312312ssdasd09-09-09-0mario_-90dasdasdasnmncmcz
czxlkdalskdjas2112 31231 fap fap fap
3123123120391-0293-01293-0192-03912-093-01293-01mario_92-0391-293-01923-0912-0391-0293-09213-091-2093-10293-01293-0192-03912-0390-12
saasdjhasjhdasjkhdaszxbcnxmzbxcmnbxzmncbmzmario_xncbnzmx
ssdkasjmario_paswrodldishidkasden123124jlkdjaslkdjlasdji3upqorp[[afu[siofuspfasoaudfpouppppdwonnnnwoooooohooo
popopopopopoporetretretpopopopopopreteret pop pop ret
for i:=1 to n do
for j:=1 to mario_hellooo do
print helloworld random shit is hard hard hard
testing congratulations this is no joke super secret password is here
hello shekllolasthingtodokas1catiscuriouswhyyounoknow
sdasdjasknannnnnnnnnncczxcxzcz xxczxxjkkljlkjlkjldasdasthisisnonononofunhello
prepare to neptuneeeeeeeee12345 zz
zzzzzzzzzzzzzzzzzzzzzda helloworld12345667
We do not forgive. We do not forget. Expect us . 023-1222-555
key: ae375f18b0c9cb94d0ebfce1aa03bb0367b3631f1d23f5c07e157addd4920dc1 (not flag)
3210391-0239-012sda kadaskjdlka21321312
2312312312312nmnm,cxnxz,mccz c211312312ssdasd09-09-09-0mario_-90dasdasdasnmncmcz
czxlkdalskdjas2112 31231 fap fap fap
3123123120391-0293-01293-0192-03912-093-01293-01mario_92-0391-293-01923-0912-0391-0293-09213-091-2093-10293-01293-0192-03912-0390-12
saasdjhasjhdasjkhdaszxbcnxmzbxcmnbxzmncbmzmario_xncbnzmx
ssdkasjmario_paswrodldishidkasden123124jlkdjaslkdjlasdji3upqorp[[afu[siofuspfasoaudfpouppppdwonnnnwoooooohooo
popopopopopoporetretretpopopopopopreteret pop pop ret
for i:=1 to n do
for j:=1 to mario_hellooo do
print helloworld random shit is hard hard hard
testing congratulations this is no joke super secret password is here
hello shekllolasthingtodokas1catiscuriouswhyyounoknow
sdasdjasknannnnnnnnnncczxcxzcz xxczxxjkkljlkjlkjldasdasthisisnonononofunhello
prepare to neptuneeeeeeeee12345 zz
zzzzzzzzzzzzzzzzzzzzzda helloworld12345667
We do not forgive. We do not forget. Expect us . 023-1222-555
key: ae375f18b0c9cb94d0ebfce1aa03bb0367b3631f1d23f5c07e157addd4920dc1 (not flag)
3210391-0239-012sda kadaskjdlka21321312
2312312312312nmnm,cxnxz,mccz c211312312ssdasd09-09-09-0mario_-90dasdasdasnmncmcz
czxlkdalskdjas2112 31231 fap fap fap
3123123120391-0293-01293-0192-03912-093-01293-01mario_92-0391-293-01923-0912-0391-0293-09213-091-2093-10293-01293-0192-03912-0390-12
saasdjhasjhdasjkhdaszxbcnxmzbxcmnbxzmncbmzmario_xncbnzmx
ssdkasjmario_paswrodldishidkasden123124jlkdjaslkdjlasdji3upqorp[[afu[siofuspfasoaudfpouppppdwonnnnwoooooohooo
popopopopopoporetretretpopopopopopreteret pop pop ret
for i:=1 to n do
for j:=1 to mario_hellooo do
print helloworld random shit is hard hard hard
testing congratulations this is no joke super secret password is here
hello shekllolasthingtodokas1catiscuriouswhyyounoknow
sdasdjasknannnnnnnnnncczxcxzcz xxczxxjkkljlkjlkjldasdasthisisnonononofunhello
prepare to neptuneeeeeeeee12345 zz
zzzzzzzzzzzzzzzzzzzzzda helloworld12345667
We do not forgive. We do not forget. Expect us . 023-1222-555
key: ae375f18b0c9cb94d0ebfce1aa03bb0367b3631f1d23f5c07e157addd4920dc1 (not flag)
3210391-0239-012sda kadaskjdlka21321312
2312312312312nmnm,cxnxz,mccz c211312312ssdasd09-09-09-0mario_-90dasdasdasnmncmcz
czxlkdalskdjas2112 31231 fap fap fap
3123123120391-0293-01293-0192-03912-093-01293-01mario_92-0391-293-01923-0912-0391-0293-09213-091-2093-10293-01293-0192-03912-0390-12
saasdjhasjhdasjkhdaszxbcnxmzbxcmnbxzmncbmzmario_xncbnzmx
ssdkasjmario_paswrodldishidkasden123124jlkdjaslkdjlasdji3upqorp[[afu[siofuspfasoaudfpouppppdwonnnnwoooooohooo
popopopopopoporetretretpopopopopopreteret pop pop ret
for i:=1 to n do
for j:=1 to mario_hellooo do
print helloworld random shit is hard hard hard
testing congratulations this is no joke super secret password is here
hello shekllolasthingtodokas1catiscuriouswhyyounoknow
sdasdjasknannnnnnnnnncczxcxzcz xxczxxjkkljlkjlkjldasdasthisisnonononofunhello
prepare to neptuneeeeeeeee12345 zz
zzzzzzzzzzzzzzzzzzzzzda helloworld12345667
We do not forgive. We do not forget. Expect us . 023-1222-555
key: ae375f18b0c9cb94d0ebfce1aa03bb0367b3631f1d23f5c07e157addd4920dc1 (not flag)

Thua emo_popo_sweat Vậy là, dù đã lấy có 1/20 của file gốc, thì sự lặp lại vẫn còn chưa kết thúc emo_popo_go

Mất thêm nửa ngày mà không biết cái nào là flag, đã thử mario_hellooo vô cùng khả nghi, nhưng không có điểm. Đã đọc hint 2 cả chục lần, nhưng không hiểu. Cũng không biết cái key (not flag) trong plain text thu được nó là gì, decode đủ kiểu vẫn chẳng đâu vào đâu.

Cuối cùng, được <boss at botbie> chỉ cho biết luôn emo_popo_pudency

flag: mario_paswrodldishidkasden123124

Còn key là gì? Nó là SHA-256 của flag, f*ck emo_popo_canny

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s