kurang berarti

Description

help me to find the hidden message in this photo

Author: H4NN

Diberikan chall.jpg dan enc.py.

Berikut adalah enc.py yang sudah saya annotate.

def insert_plaintext_into_image(input_file, output_file, plaintext, offset):
    
    #  read file
    with open(input_file, 'rb') as file:
        file_bytes = bytearray(file.read())
    
    # change plaintext to binary
    plaintext_binary = ''.join(format(ord(char), '08b') for char in plaintext)
    
    plaintext_index = 0
    plaintext_length = len(plaintext_binary)

    # start from an offset
    for i in range(offset, len(file_bytes)):
        if plaintext_index < plaintext_length:
            original_byte = file_bytes[i]
            plaintext_bit = int(plaintext_binary[plaintext_index])

            # update the file byte with these
            new_byte = (original_byte & 0xFE) | plaintext_bit
            file_bytes[i] = new_byte
            plaintext_index += 1
        else:
            break
    
    with open(output_file, 'wb') as file:
        file.write(file_bytes)
    
    print(f"{output_file}")

input_file = ''
output_file = 'chall.jpg'
plaintext = "flag"
offset = 0x00000D00
insert_plaintext_into_image(input_file, output_file, plaintext, offset)

Pada chall.jpg, telah ditaruh plaintext berupa binary string ke dalam data bytes dari gambar. Saya mencoba melakukan eksplorasi untuk memahami cara penaruhan plaintext tersebut.

Di sini, & 0xFE akan membulatkan suatu bilangan ke bilangan genap sebelumnya. Setelah itu, melakukan | 1 pada hasilnya sama seperti menambahkan nilai hasilnya dengan 1 (atau 0 jika | 0). Intinya, dapat ditarik kesimpulan bahwa jika suatu byte gambar ganjil, maka bit binary dari plaintext nya adalah ‘1’, sedangkan jika byte-nya genap maka ‘0’.

Karena panjang flag tidak diketahui, saya asumsikan saja panjang binary stringnya terdiri dari 800 bit.

with open("chall.jpg", 'rb') as file:
	file_bytes = bytearray(file.read())

offset = 0x00000D00

result_bin = ""

print("skjhagd")
# start from an offset
for i in range(offset, len(file_bytes)):
	if i == 800:
		break
	if (file_bytes[i] % 2) == 0:
		result_bin += '0'
	else:
		result_bin += '1'

print(result_bin)

Hasil binarynya kita tinggal decode saja menggunakan Cyberchef.

Flag: TechnoFair11{patenkalikaubang}

Last updated