☺️ Уютное сообщество для публикации райтапов с разных CTF соревнований и платформ
💬 Наш чатик: @writeup_chat
✍️ По любому вопросу можно писать мне: @freenameruuuu
✅ Таски решать тут: @writeup_ctf_bot
Post #895
1.96K
#duckerzctf2026 #Hardware
Заброшенный маяк [клик]
Открываем firmware.elf в IDA Pro. В окне Functions видим:
В окне Structures видим сегменты:
Исследование функции decrypt_flag:
Ключевые моменты:
- Чтение из EEPROM
- Операция XOR (eor инструкция)
- Ключ длиной 5 байт (делитель = 5)
Переходим к сегменту .data (адрес 0x800100):
Переходим к сегменту .eeprom (адрес 0x810000):
Написание скрипта для расшифровки:
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
Заброшенный маяк [клик]
Открываем firmware.elf в IDA Pro. В окне Functions видим:
decrypt_flag (0x4B) — ключевая функция.
main (0x7D) — основная программа
eeprom_read_byte (0xDC) — чтение из EEPROM
В окне Structures видим сегменты:
.text — код программы
.data — данные (адрес 0x800100)
.eeprom — EEPROM данные (адрес 0x810000)
Исследование функции decrypt_flag:
.text:0000004B decrypt_flag: ; CODE XREF: main+F↓p
.text:0000004B push r12
.text:0000004C push r13
.text:0000004D push r14
.text:0000004E push r15
.text:0000004F push r16
.text:00000050 push r17
.text:00000051 push YL
.text:00000052 push YH
.text:00000053 movw r12:r13, r24:r25
.text:00000054 movw r16:r17, r24:r25
.text:00000055 ldi YL, 0
.text:00000056 ldi YH, 0
.text:00000057 mov r0, ZH
.text:00000058 ldi ZH, 5
.text:00000059 mov r14, ZH
.text:0000005A mov r15, r1
.text:0000005B mov ZH, r0
.text:0000005C
.text:0000005C loc_5C: ; CODE XREF: decrypt_flag+26↓j
.text:0000005C movw r24:r25, Y
.text:0000005D subi r24, 0
.text:0000005E sbci r25, 0
.text:0000005F call eeprom_read_byte
.text:00000061 mov r18, r24
.text:00000062 movw r24:r25, Y
.text:00000063 movw r22:r23, r14:r15
.text:00000064 call _div
.text:00000066 movw Z, r24:r25
.text:00000067 subi ZL, 0
.text:00000068 sbci ZH, -1
.text:00000069 ld r24, Z
.text:0000006A eor r24, r18
.text:0000006B movw Z, r16:r17
.text:0000006C st Z+, r24
.text:0000006D movw r16:r17, Z
.text:0000006E adiw Y, 1
.text:0000006F cpi YL, 0x1F
.text:00000070 cpc YH, r1
.text:00000071 brne loc_5C
.text:00000072 movw Z, r12:r13
.text:00000073 std Z+0x1F, r1
.text:00000074 pop YH
.text:00000075 pop YL
.text:00000076 pop r17
.text:00000077 pop r16
.text:00000078 pop r15
.text:00000079 pop r14
.text:0000007A pop r13
.text:0000007B pop r12
.text:0000007C ret
.text:0000007C ; End of function decrypt_flag
Ключевые моменты:
- Чтение из EEPROM
- Операция XOR (eor инструкция)
- Ключ длиной 5 байт (делитель = 5)
Переходим к сегменту .data (адрес 0x800100):
.data:00800100 xor_key: .db 0x37, 0x42, 0x15, 0x7A, 0x2F ;
Переходим к сегменту .eeprom (адрес 0x810000):
.eeprom:00810000 encrypted_flag: .db 0x73, 0x17, 0x56, 0x31, 0x6A, 0x65, 0x18, 0x6E, 0x3F
.eeprom:00810009 .db 0x6A, 0x67, 0x10, 0x25, 0x37, 0x70, 0x44, 0x31, 0x25
.eeprom:00810012 .db 8, 0x4A, 0x13, 0x1D, 0x22, 0x12, 0x6A, 0x68, 4, 0x79
.eeprom:0081001C .db 0x4E, 0x44, 0x4A, 0
Написание скрипта для расшифровки:
encrypted = bytes([
0x73, 0x17, 0x56, 0x31, 0x6A, 0x65, 0x18, 0x6E,
0x3F, 0x6A, 0x67, 0x10, 0x25, 0x37, 0x70, 0x44,
0x31, 0x25, 0x08, 0x4A, 0x13, 0x1D, 0x22, 0x12,
0x6A, 0x68, 0x04, 0x79, 0x4E, 0x44, 0x4A, 0x00
])
key = [0x37, 0x42, 0x15, 0x7A, 0x2F]
flag = ""
for i in range(31):
flag += chr(encrypted[i] ^ key[i % 5])
print(f"Flag: {flag}")
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube
- 🔥 6














