# PicoCTF 2023
## Forensics
| Category | Challenge Name | Difficulty |
| -------- | -------------- | ---------- |
| Forensics| hideme | Very Easy |
| Forensics| PcapPoisoning | Very Easy |
| Forensics| who is it | Very Easy |
| Forensics| FindAndOpen | Easy |
| Forensics| MSB | Easy |
| Forensics| Invisible WORDs| Medium |
| Forensics| UnforgottenBits| Hard |
## Hideme
### Description :

### Giải Pháp :
Đề cho chúng ta 1 file ảnh flag.png

=> Phân tích nó với các lệnh cơ bản với exiftool và binwalk thì mình phát hiện :

=> nó extract ra 1 file zip có chứa ảnh flag.png trong thư mục secret => mở nó ra và mình nhận được flag.


## PcapPoisoning
### Description :

### Giải Pháp :
Đề cho chúng ta 1 file pcap => phân tích nó bằng wireshark.
=> phát hiện điểm đáng ngờ ở protocol FTP :

=> Follow TCP stream thì mình phát hiện ra flag ở packet nằm chung với nó @@

Cách nhanh là dùng tool huyền thoại =)) `strings`

> `flag : picoCTF{P64P_4N4L7S1S_SU55355FUL_f621fa37}`
## who is it
### Description :

### Giải Pháp :
Bài này cho chúng ta 1 file email.Mở nó bằng Mail thì mình thấy ko có gì đăccj biết chỉ là nội dung chuyển khoản. Mở bằng Notepad để xem tổng quát về nó => đọc qua 1 lúc mình vẫn không thấy gì đặc biệt thì khi đọc hint của bài là :
`whois can be helpful on IP addresses also, not only domain names.`
=> Mình tra gg thì tìm được web [này](https://www.whatismyip.com/ip-whois-lookup/), đây là web tra cứu thông tin của chủ sỡ hửu từ IP Address.
IP của mail này là : `173.249.33.206`(bạn cs thể tìm nó khi mở bằng notepad)
=> Ném nó lên web kia và mình tìm được chủ sỡ hữu của web này :

> `flag : picoCTF{WilhelmZwalina}`
## FindAndOpen
### Description :

### Giải Pháp :
Bài này cho mình 1 file flag.zip và 1 file dump.pcap, file zip có bắt nhập pass để lấy flag nên bây giờ mình sẽ phân tích dump.pcap để lấy pass.
Dùng wireshark để phân tích thì mình thấy ở packet đầu tiên ở phần data mình đã thấy được dòng chữ có nghĩa :
'Flying on Ethernet secret: Is this is the flag'

Tới đây có 2 cách :
+ 1 là làm thủ công : Các bạn có thể dựa vào dữ liệu ở phần data đó và đọc các packet liên quan đến nó => đọc 1 lúc các bạn sẽ thấy 1 mã base64
`VGhpcyBpcyB0aGUgc2VjcmV0OiBwaWNvQ1RGe1IzNERJTkdfTE9LZF8=`

=> decode base64 thì ta nhận được :
`This is the secret: picoCTF{R34DING_LOKd_`
Đến đây lúc đầu mình nghĩ là đã tìm được 1 nữa flag và tiếp tục tìm kiếm phần còn lại, nhưng không mình đã bị lừa :) thực chất đây chính là pass của file zip lúc nãy @@, nó đơn giản hơn mình nghĩ :vv. => Nhập pass và ta có được flag.
+ 2 là cách mà mình dùng là sử dụng tshark để lấy hết các dữ liệu ở phần data đó ra và phân tích.(Bài này khá it packet nên có thể dùng cách 1 nhưng đối với bài nhiều packet thì mình khuyên các bạn nên dùng cách này để đỡ tốn tg hơn)
`$tshark -r dump.pcap -T fields -e data.data "data.data != 0" > 1.txt`
=> decode hex => decode base64


Tới đây chỉ cần làm tương tự như cách 1 là có được flag.
> `flag : picoCTF{R34DING_LOKd_fil56_succ3ss_419835ef}`
## MSB
### Description :

### Giải Pháp :
Đề bài cho chúng ta 1 file ảnh png. Đọc mô tả của đề bài thì nó có đề cập đến `LSB`
>`Trình tạo ảnh LSB (Bit ít quan trọng nhất) là một công cụ được sử dụng trong kỹ thuật ghi ảnh giấu tin, đây là phương pháp ẩn tin nhắn hoặc dữ liệu trong các dạng dữ liệu khác như hình ảnh, âm thanh hoặc video.
Trình chụp ảnh LSB hoạt động bằng cách thao tác các bit có ý nghĩa nhỏ nhất của các giá trị pixel trong một hình ảnh. Vì các bit ít quan trọng nhất là các bit ít ảnh hưởng nhất đến giá trị tổng thể của pixel, nên việc thay đổi chúng chỉ có thể dẫn đến một sửa đổi nhỏ về hình thức của hình ảnh. Điều này có thể được sử dụng để nhúng các thông báo ẩn trong hình ảnh, sau này có thể được trích xuất bằng thuật toán LSB tương tự.`
Thì đến đây mình sẽ phân tích 1 chút về các bits trong file png :
>`Số bit trong một file ảnh PNG phụ thuộc vào độ sâu màu của ảnh. Độ sâu màu là số lượng bit được sử dụng để mô tả mỗi màu sắc trong ảnh.
Ví dụ, nếu ảnh PNG được mã hóa với độ sâu màu 8 bit cho mỗi kênh màu (RGB), tức là mỗi kênh màu có thể có 256 giá trị khác nhau (2^8), thì tổng số bit cần để lưu trữ một pixel trong ảnh là 24 bit (3 kênh màu x 8 bit/kênh).
Vì vậy, số bit cần thiết để lưu trữ một file ảnh PNG sẽ phụ thuộc vào độ phân giải và độ sâu màu của ảnh. Bạn có thể tìm hiểu thông tin chi tiết về độ phân giải và độ sâu màu của một file ảnh PNG bằng cách sử dụng các phần mềm chỉnh sửa ảnh hoặc đọc thông tin metadata của tệp.`
=> thì ở đây ảnh mà chúng ta đang phân tích có độ sâu màu là 8 bit cho mỗi kênh màu RGB(dùng exiftool để xác nhận nó).

=> Tổng số bit cần để lưu trữ một pixel trong ảnh là 24 bit ( 3 kênh màu Red,Green,Blue x 8bit/kênh)
Để xác định được bit ít quan trọng nhất (LSB) thì có thể dùng [tools](https://stegonline.georgeom.net/image) này để xác định nó.
=> Xác định được đó là bit thứ 7 => mình dùng stegsolve để extract dữ liệu từ 3 kênh màu RGB(bit thứ 7) :

=> Nó tạo thành chuỗi có nghĩa => Lưu file lại và mình lụm được cờ.

> `flag : picoCTF{15_y0ur_que57_qu1x071c_0r_h3r01c_ee3cb4d8}`
## Invisible WORDs
### Description :

### Giải Pháp :
Đề cho chúng ta 1 file ảnh .bmp :

Bây giờ ta sẽ phân tích nó 1 chút, web tools đầu tiên mà mình hay dùng để phân tích là [đây](https://aperisolve.fr/), nó có khá nhiều tools.
Mình cũng đã dùng stegsolve, exiftool, zsteg nhưng cũng ko có gì đặc biệt, sau đó mình xem phần strings của nó thì nhận thấy 1 điều rất đáng nghi ngờ :

=> `PK` là header của file zip. Tới đây mình dùng hxd để xem rõ hơn

Oke bầy giờ mình sẽ dựa vào [List of file signatures](https://www.garykessler.net/library/file_sigs.html) để fix nó lại.
Phần Hex Signature của zip : `50 4B 03 04 14 00 00 00 08 00`
Và phần Trailer của nó là : `50 4B 05 06 ...,theo sau là 18 byte bổ sung ở cuối tệp.`
Mà mình nhận thấy 1 điều rằng kể từ 50 4B thì sẽ có 2 bytes rác chen giữa vào.
EX :

=> Các bytes rác chen giữa là : `95 52 C6 18 CE 3D 10 4A`

=> Các bytes rác chen giữa là : `66 14`
Từ đây có thể thấy cả file này đều có 2 bytes rác chen giữa như vậy, nên mình sẽ viết kịch bản để xóa các bytes rác đó đi :
```
fi = open(r"C:\Users\ASUS\Downloads\5\output.bmp",'rb')
fo = open('output1.bmp','wb')
offset4=fi.read(4)
while (len(offset4)==4):
fo.write(offset4[:2])
offset4 = fi.read(4)
fi.close()
fo.close()
```
Và sau khi xóa các bytes rác đó đi mình nhận được file output1.bmp và mở bằng hxd để chỉnh thêm 1 chút nx để mở đc file zip.
oke bây giờ mình sẽ xóa từ phần `PK` trở lên (phần header của file zip) để lấy nó làm header.

Và dựa vào phần trailer của zip như mình đã nói ở trên, mình sẽ xóa tất cả các bytes sau byte bổ sung cuối cùng của nó(bytes thứ 18).
* Lưu ý : khúc xóa này nên dùng select block để xóa, đừng xóa chay ha vì khá là dài đấy :vv

Sau đó mình lưu nó với duôi .zip và mở nó ra

Và chỉ cần mở file `ZnJhbmtlbnN0ZWluLXRlc3QudHh0` bằng Notepad và lụm flag thôi :vv

> `Flag : picoCTF{w0rd_d4wg_y0u_f0und_5h3113ys_m4573rp13c3_e4f8c8f0}`
## UnforgottenBits
### Description :

### Giải Pháp :
Bài này phải tìm kiếm khá chi tiết mới có thể ra được.
Đề bài cho chúng ta 1 file đĩa disk.flag.img => dùng AccessData FTK Imager để phân tích
> `
FTK Imager là một phần mềm dành cho pháp y và những người thực hiện điều tra kỹ thuật số để tạo và phân tích hình ảnh đĩa từ các thiết bị lưu trữ như ổ cứng, USB, thẻ nhớ, CD/DVD, v.v. FTK Imager cho phép người dùng sao chép toàn bộ nội dung của một đĩa và tạo một hình ảnh forensically sound (an toàn pháp lý). Hình ảnh này sẽ giữ nguyên toàn bộ dữ liệu trong đĩa gốc mà không bị thay đổi, ghi đè hoặc làm hỏng. FTK Imager cũng cung cấp các công cụ phân tích và khai thác dữ liệu từ hình ảnh đĩa, giúp người dùng tìm kiếm, phân tích và trích xuất các tài liệu quan trọng từ hình ảnh.
`
Phân tích 1 lúc thì mình tìm được cái dữ kiện như sau :
+ 4 bức ảnh :

+ Các cuộc trò chuyện giữa yone(1 vị tướng trong lol) và avidreader :

+ Lịch sử tìm kiếm author :

+ Và 1 mã nhìn khá giống binary nhưng thực chất ko phải vì length ko phải của bin (cái này để phân tích sau nha) :
```
01010010100.01001001000100.01001010000100.00101010010101.01000100100100.00100100000100.01000100000101.01000100001010.00000100000001.00001001010000.00000100010010.01000100010010.01001001001000.10001001000101.01001001010000.00001001000100.01001001010001.00000100000010.01000100010000.00001001001000.10000100010100.01000000010100.01001010000010.00101001010000.00001010101000.10000100100100.00101001000100.01000100010100.01001001010001.00000100010010.01000100010000.00001001000101.01000100010010.01000100010001.00000100001000.10001001000101.01001001001010.00000100010100.01000100000100.01000100010001.00000100000001.00000100001010.00000100010001.00001001000100.01000100000001.00000100001010.00000100001000.10000100000001.00000100010010.01001001001010.00000100000100.01000100010001.00000100001000.10001001010000.00001001010000.00000100000101.01001001000100.01000100010010.01000100010010.01001001000100.01000100010010.01000100000101.01001001000100.01001001001010.00000100010100.01000100010001.00000100000100.01000100000100.01000100000010.01000100010001.00001001000101.01000100010010.01000100000010.01001001010001.00001001001010.00001001001000.10000100000100.01001001000101.01001001000101.01000100010010.01001001010000.00000100010010.01001001001000.10001001000100.01000100010010.01000100010001.00000100000101.01000100010000.00001001001010.00001001000100.01000000010100.01001001010101.01001010100010.00100100100100.00100100010100.01000100000001.00000100010010.01000100001000.10000100001010.00000100010010.01001001010000.00000100001000.10000100010010.01001001010001.00001001001000.10000100010010.01001001001010.00001001000101.01000100000010.01001001001000.10000100001010.00001001000100.01000100001000.10000100010000.00001001010001.00000100000010.01000100010010.01001001010001.00000100000001.00001001010001.00001001010000.00001001000101.01000100000010.01000100000010.01000100010100.01001001010001.00000000010100.010
```
Oke bây giờ chúng ta sẽ phân tích từng dữ kiện ấy.
Đầu tiền là 4 tấm ảnh kia thì mình export nó ra và phân tích nó nhưng không phát hiện gì.
Tiếp theo là đoạn chat thì nhận thấy trong đó yone có nhắc đến `steghide`, nó là một công cụ ẩn tin được sử dụng để giấu thông tin trong các tập tin hình ảnh và âm thanh trong steganography.Và đặc biệt nó có đề cập đến password : `akalibardzyratrundle`
Đến đây mình sẽ dùng steghide extract 4 ảnh kia ra xem sao :

Pass chỉ đúng với 3 file ảnh đầu tiên, nó đều extract ra file .enc .
> `File .enc là một phần mở rộng tệp được sử dụng để chỉ định rằng tệp đã được mã hóa. Thông thường, tệp .enc chứa dữ liệu được mã hóa bằng một thuật toán mã hóa nhất định và cần được giải mã bằng cách sử dụng cùng một thuật toán mã hóa để truy cập các thông tin được lưu trữ trong tệp.`
Để ý đến đoạn chat 1 lần nữa chúng ta thấy nó có đề cập đến `openssl`.
>`OpenSSL là một thư viện mã nguồn mở cung cấp các công cụ và thủ tục mã hóa, giải mã, xác thực và quản lý chứng chỉ số. OpenSSL hỗ trợ nhiều thuật toán mã hóa khác nhau như RSA, AES, DES, Blowfish, và các thuật toán băm như SHA-1 và SHA-256. `
Và chính xác thì thuật toán mà nó đang đề cập đến thuật toán nó đang đề cập là AES cbc và có cả key ,salt và iv.

Dựa vào độ dài của key,salt và iv thì mình xác định đây là AES-256 CBC.
```
salt=0f3fa17eeacd53a9
key=58593a7522257f2a95cce9a68886ff78546784ad7db4473dbd91aecd9eefd508
iv=7a12fd4dc1898efcd997a1b9496e7591
```
Oke bây giờ mình sẽ dùng lệnh `opensll` để decrypt 3 file enc kia xem thử có gì khum.
```
$openssl enc -d -aes-256-cbc -iv 7a12fd4dc1898efcd997a1b9496e7591 -K 58593a7522257f2a95cce9a68886ff78546784ad7db4473dbd91aecd9eefd508 -S 0f3fa17eeacd53a9 -in les-mis.txt.enc -out 1.txt
```
* Giải Thích :
```
enc: Tùy chọn này cho OpenSSL biết rằng chúng tôi muốn sử dụng chức năng mã hóa/giải mã của nó.
-d: Cờ này chỉ định rằng chúng tôi muốn giải mã tệp.
-aes-256-cbc: Tùy chọn này yêu cầu OpenSSL sử dụng thuật toán mã hóa AES-256-CBC. CBC là viết tắt của Cipher Block Chaining, là một chế độ hoạt động cho mật mã khối.
-iv 7a12fd4dc1898efcd997a1b9496e7591: Điều này chỉ định vectơ khởi tạo (IV) để sử dụng cho quá trình giải mã. IV là một giá trị ngẫu nhiên được sử dụng để khởi tạo thuật toán mã hóa và phải khác nhau đối với từng thao tác mã hóa.
-K 58593a7522257f2a95cce9a68886ff78546784ad7db4473dbd91aecd9eefd508: Tùy chọn này chỉ định khóa mã hóa sẽ sử dụng cho quá trình giải mã. Khóa này là một chuỗi thập lục phân phải khớp với khóa được sử dụng trong quá trình mã hóa.
-S 0f3fa17eeacd53a9: Giá trị này chỉ định giá trị muối sẽ sử dụng cho quá trình giải mã. Muối là một giá trị ngẫu nhiên được sử dụng để tăng cường quá trình mã hóa.
-in les-mis.txt.enc: Điều này chỉ định tệp đầu vào để giải mã. Trong trường hợp này, tệp có tên les-mis.txt.enc.
-out 1.txt: Điều này chỉ định tệp đầu ra để ghi nội dung được giải mã. Trong trường hợp này, tệp sẽ được đặt tên là 1.txt.
```
=> Mình mở file 1.txt lên đọc lướt qua thì thấy đây chỉ là truyện của victor hugo

Và 3 file enc kia cũng tương tự như zậy @@ .
Lúc này dữ kiện bây giờ của mình chỉ còn file 7.bmp nhưng điều quan trọng là phải tìm đc pass của nó.
Oke bây h chúng ta sẽ tiếp tục tìm kiếm kỹ hơn xem sao :vv
Sau khi lục tung mọi thứ thì mình phát hiện ra vẫn còn 3 file txt(lúc đầu mình tìm ra rồi nhưng cứ nghĩ nó ko có gì chỉ là tên tướng lol =)) )

Đọc kỹ thì mới thấy ở file 3.txt có dòng :
`I keep forgetting this, but it starts like: yasuoaatrox...`
Thì mình nghĩ đây có thể là 1 phân nữa của pass file 7.bmp vì dựa vào pass đầu tiền mà mình tìm ra là `akalibardzyratrundle` đây là tên 4 vị tướng trong lol ghép lại và cũng không ngoại trừ khả năng đối với `yasuoaatrox...` thì ở đây nó đã có tên của 2 vị tướng rồi là yasuo và aatrox nên ta cần ghép ngấu nhiên thêm tên của 2 vị tướng nx để tạo thành pass hoàn chỉnh.
=> Mình tạo wordlist cho nó và dùng stegseek để tìm ra pass chính xác.
```
kma = '''
Aatrox
Ahri
Akali
Alistar
Amumu
Anivia
Annie
Aphelios
Ashe
Aurelion Sol
Azir
Bard
Blitzcrank
Brand
Braum
Caitlyn
Camille
Cassiopeia
Cho'Gath
Corki
Darius
Diana
Dr. Mundo
Draven
Ekko
Elise
Evelynn
Ezreal
Fiddlesticks
Fiora
Fizz
Galio
Gangplank
Garen
Gnar
Gragas
Graves
Hecarim
Heimerdinger
Illaoi
Irelia
Ivern
Janna
Jarvan IV
Jax
Jayce
Jhin
Jinx
Kaisa
Kalista
Karma
Karthus
Kassadin
Katarina
Kayle
Kayn
Kennen
Kha'Zix
Kindred
Kled
Kog'Maw
LeBlanc
Lee Sin
Leona
Lillia
Lissandra
Lucian
Lulu
Lux
Malphite
Malzahar
Maokai
Master Yi
Miss Fortune
Mordekaiser
Morgana
Nami
Nasus
Nautilus
Neeko
Nidalee
Nocturne
Nunu & Willump
Olaf
Orianna
Ornn
Pantheon
Poppy
Pyke
Qiyana
Quinn
Rakan
Rammus
Rek'Sai
Rell
Renekton
Rengar
Riven
Rumble
Ryze
Samira
Sejuani
Senna
Seraphine
Sett
Shaco
Shen
Shyvana
Singed
Sion
Sivir
Skarner
Sona
Soraka
Swain
Sylas
Syndra
Tahm Kench
Taliyah
Talon
Taric
Teemo
Thresh
Tristana
Trundle
Tryndamere
Twisted Fate
Twitch
Udyr
Urgot
Varus
Vayne
Veigar
VelKoz
Vi
Viego
'''.split('\n')
file1 = open('wordlist.txt', 'w')
for i in range(len(kma)):
for j in range(len(kma)):
file1.write('yasuoaatrox' + kma[i].lower() + kma[j].lower() + '\n')
file1.close()
```
Và sau khi có được [wordlist](https://github.com/KMANVK/picoCTF-2023/blob/main/wordlist.txt), chúng ta sẽ bắt đầu crack pass file 7.bmp bằng [stegseek](https://github.com/RickdeJager/stegseek),nó là 1 công cụ bẻ khóa rất nhanh.
Dùng lệnh :
`$stegseek 7.bmp wordlist.txt `

`pass : yasuoaatroxashecassiopeia`
Và mình nhận được file ledger.1.txt.enc được extract thành 7.bmp.out nhưng cái đó chỉ là tên ko quan trọng, chỉ cần đổi tên nó lại là đươc.
oke bây giờ ta sẽ dùng opensll với key,salt và iv như cũ để xem sao.

Tới đây nó báo lỗi thì chắc chắn là key salt và iv đã sai rồi @@, giờ ta phải đi tìm nó thôi :vv
Hmm, bây giờ thì chúng đã quay lại mã mà nhìn khá giống bin nhưng thực chất không phải ấy =)) .À còn 1 dữ kiện nữa đó là lịch sử tìm kiếm của author thì thấy ông này đang tìm cái gì đó trên gg. Mình cop cái URL đầu tiên và ném nó lên gg xem sao và mình nhận được :

=> nó hiện ra là number encodings, đây là quá trình biểu diễn một số dưới dạng chuỗi ký tự hoặc dữ liệu số hóa để có thể xử lý và lưu trữ dữ liệu số trong các hệ thống máy tính.Nhưng thế này khá là chung chung vì có khá nhiều loại mã hóa @@. Nên mình tiếp tục phân tích lịch sử đó tiếp.
=> Thì ở URL cuối cùng nó dẫn mình đến một loại mã được gọi là
Golden ratio base
```
Golden ratio base là một hệ thống cơ số (base) dựa trên tỉ số vàng (golden ratio) được ký hiệu là "φ" (phi). Trong hệ thống này, mỗi số được biểu diễn dưới dạng tổ hợp của các lũy thừa của phi và số nguyên dương.
Cụ thể, để biểu diễn một số trong hệ thống golden ratio base, chúng ta sử dụng các ký hiệu "1" và "0" như trong hệ thống nhị phân, nhưng giá trị của mỗi chữ số lại khác. Các giá trị tương ứng với chữ số "1" và "0" trong golden ratio base là:
Chữ số "1" tương ứng với giá trị của một lũy thừa của phi. Cụ thể, giá trị của mỗi lũy thừa của phi được tính bằng cách nhân phi với chính nó.
Chữ số "0" tương ứng với một số nguyên dương.
Ví dụ, số 7 trong hệ thống golden ratio base sẽ được biểu diễn bởi chuỗi "100001" (tức là phi^3 + 1), vì:
Chữ số "1" đầu tiên biểu thị giá trị của phi^3.
Các chữ số "0" còn lại biểu thị giá trị của số nguyên dương 1.
Hệ thống golden ratio base không phổ biến như các hệ thống cơ số khác như nhị phân, thập phân, hay hexa. Tuy nhiên, nó được sử dụng trong một số lĩnh vực như nghệ thuật và thiết kế để tạo ra các tỷ lệ hài hòa và đẹp mắt.
```
Sau một lúc tìm hiểu về nó thì xác định được cụm mã giống file bin kia chính là `Golden ratio base`.Mã này lần đầu mình gặp nên có chút khó khăn trong quá trình giải mã.
Nhưng tìm hiểu kỹ thì đống mã kia không hề đúng format của nó nên không thể giải mã nó ra ngay lập tức được.Theo mình tìm hiểu thì nó là tổ hợp của fibonacci.
oke bây giờ mình sẽ viết kịch bản cho nó :
Ở đây chúng ta có 2 kịch bản cho nó :
1. `Ý tưởng : Để đúng với format nó thì đầu tiên mình lấy 15 chữ số nhị phân trong đống mã đó bằng cách tính tổng các lũy thừa tương ứng phi dựa trên vị trí của các chữ số. Các giá trị thập phân kết quả sau đó được chuyển đổi thành các ký tự ASCII tương ứng của chúng và được nối để tạo thành chuỗi được giải mã cuối cùng `.
```
a = "01010010100.01001001000100.01001010000100.00101010010101.01000100100100.00100100000100.01000100000101.01000100001010.00000100000001.00001001010000.00000100010010.01000100010010.01001001001000.10001001000101.01001001010000.00001001000100.01001001010001.00000100000010.01000100010000.00001001001000.10000100010100.01000000010100.01001010000010.00101001010000.00001010101000.10000100100100.00101001000100.01000100010100.01001001010001.00000100010010.01000100010000.00001001000101.01000100010010.01000100010001.00000100001000.10001001000101.01001001001010.00000100010100.01000100000100.01000100010001.00000100000001.00000100001010.00000100010001.00001001000100.01000100000001.00000100001010.00000100001000.10000100000001.00000100010010.01001001001010.00000100000100.01000100010001.00000100001000.10001001010000.00001001010000.00000100000101.01001001000100.01000100010010.01000100010010.01001001000100.01000100010010.01000100000101.01001001000100.01001001001010.00000100010100.01000100010001.00000100000100.01000100000100.01000100000010.01000100010001.00001001000101.01000100010010.01000100000010.01001001010001.00001001001010.00001001001000.10000100000100.01001001000101.01001001000101.01000100010010.01001001010000.00000100010010.01001001001000.10001001000100.01000100010010.01000100010001.00000100000101.01000100010000.00001001001010.00001001000100.01000000010100.01001001010101.01001010100010.00100100100100.00100100010100.01000100000001.00000100010010.01000100001000.10000100001010.00000100010010.01001001010000.00000100001000.10000100010010.01001001010001.00001001001000.10000100010010.01001001001010.00001001000101.01000100000010.01001001001000.10000100001010.00001001000100.01000100001000.10000100010000.00001001010001.00000100000010.01000100010010.01001001010001.00000100000001.00001001010001.00001001010000.00001001000101.01000100000010.01000100000010.01000100010100.01001001010001.00000000010100.010"
b = []
for i in range(0, len(a), 15):
b.append(a[i:i+15])
flag = ""
phi = (1 + 5**0.5) / 2
for i in range(0, len(b)):
S = 0
s = b[i]
for j in range(11):
if s[j] == '1':
S += phi ** (10 - j)
for k in range(12, len(s)):
if s[k] == '1':
S += phi ** (11 - k)
flag += chr(round(S))
print(flag)
```
2. `Ý tưởng : Để đúng với format nó thì đầu tiên mình lấy 15 chữ số nhị phân trong đống mã đó chuyển nó sang số phigital. Mã Phigital là một hệ thống số Phi cơ số trong đó các chữ số là 0 hoặc 1 và cơ số là tỷ lệ vàng Phi, xấp xỉ bằng 1,6180339887 , sau đó chuyển nó sang hệ thập phân (dec) và in ra kết quả là ACSII`.
```
import math
Phi=(math.sqrt(5)+1)/2 #((1 + √5)/2)
class PHIC:
def __init__(self, p, c):
self.phi = p
self.one = c
def toStr(self):
if self.phi == 0:
return self.one
return str(self.phi) + "Phi" + ("+" if self.one > 0 else "") + (str(self.one) if self.one != 0 else "")
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
elif n < 0:
return (-1)**(-n+1)*fib(-n)
else:
return fib(n-1) + fib(n-2)
def addPHIC(p, q):
return PHIC(p.phi + q.phi, p.one + q.one)
def phipowPHIC(p):
return PHIC(fib(p), fib(p-1))
def phigitstodec(phigits):
dp = phigits.find('.')
DEC = PHIC(0,0)
for i in range(len(phigits)):
if phigits[i] == '1':
pw = (dp - i - (1 if i < dp else 0))
DEC = addPHIC(DEC, phipowPHIC(pw))
# print(DEC.toStr())
return DEC.phi*Phi+DEC.one
bits = '01010010100.01001001000100.01001010000100.00101010010101.01000100100100.00100100000100.01000100000101.01000100001010.00000100000001.00001001010000.00000100010010.01000100010010.01001001001000.10001001000101.01001001010000.00001001000100.01001001010001.00000100000010.01000100010000.00001001001000.10000100010100.01000000010100.01001010000010.00101001010000.00001010101000.10000100100100.00101001000100.01000100010100.01001001010001.00000100010010.01000100010000.00001001000101.01000100010010.01000100010001.00000100001000.10001001000101.01001001001010.00000100010100.01000100000100.01000100010001.00000100000001.00000100001010.00000100010001.00001001000100.01000100000001.00000100001010.00000100001000.10000100000001.00000100010010.01001001001010.00000100000100.01000100010001.00000100001000.10001001010000.00001001010000.00000100000101.01001001000100.01000100010010.01000100010010.01001001000100.01000100010010.01000100000101.01001001000100.01001001001010.00000100010100.01000100010001.00000100000100.01000100000100.01000100000010.01000100010001.00001001000101.01000100010010.01000100000010.01001001010001.00001001001010.00001001001000.10000100000100.01001001000101.01001001000101.01000100010010.01001001010000.00000100010010.01001001001000.10001001000100.01000100010010.01000100010001.00000100000101.01000100010000.00001001001010.00001001000100.01000000010100.01001001010101.01001010100010.00100100100100.00100100010100.01000100000001.00000100010010.01000100001000.10000100001010.00000100010010.01001001010000.00000100001000.10000100010010.01001001010001.00001001001000.10000100010010.01001001001010.00001001000101.01000100000010.01001001001000.10000100001010.00001001000100.01000100001000.10000100010000.00001001010001.00000100000010.01000100010010.01001001010001.00000100000001.00001001010001.00001001010000.00001001000101.01000100000010.01000100000010.01000100010100.01001001010001.00000000010100.010'
a = [bits[i:i+15] for i in range(0, len(bits), 15)]
res = []
for i in a:
res.append(math.ceil(phigitstodec(i)))
print(bytes(res).decode())
```
=> chạy kịch bản và mình nhận được key, salt và iv mới

```
salt=2350e88cbeaf16c9
key=a9f86b874bd927057a05408d274ee3a88a83ad972217b81fdc2bb8e8ca8736da
iv=908458e48fc8db1c5a46f18f0feb119f
```
Oke bây giờ mình đã có đủ điều kiện để chạy opensll rồi, chạy thôi :
```
$openssl enc -d -aes-256-cbc -iv 908458e48fc8db1c5a46f18f0feb119f -K a9f86b874bd927057a05408d274ee3a88a83ad972217b81fdc2bb8e8ca8736da -S 2350e88cbeaf16c9 -in ledger.1.txt.enc -out flag.txt
```
Và cuối cùng thì mình cũng nhận được flag.

`Flag : picoCTF{f473_53413d_77fbcfb9}`