реклама на сайте
подробности

 
 
> Дырка в LPC bootloader (старые чипы), Наконец нашел время ее залатать
KRS
сообщение May 3 2007, 13:33
Сообщение #1


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Как я уже говрил, и здесь раньше обсуждали.
В весиях bootloader до 1.64 (включительно) для чипов LPC_2114_2124_2119_2129_2194_2212_2214_2292_2294
есть дыра. Можно легко считать защищенный флешь

В филипс я письмо уже давно посылал, они ответили что выйдет новая ревизия чипа.
Для старых они похоже и не собираются исправлть бутлоадер.
В общем вот мое описание дыры:

В исследованном бутлоадере распределение памяти такое:

RAM:40000128 unsigned protection_flag
RAM:4000012C char recv_buf[70] сюда принимается команда
RAM:40000172 char cmd[15]; сюда
char param1[15]; происходит
char param2[15]; разбор
char param3[15]; по словам
char param4[15]; разделенными пробелом
RAM:400001BD char unsued[3];
RAM:400001C0 char* param_ptrs[5]={cmd,param1,param2,param3,param4}

При разборе команды первые 4 слова разделенные пробелом складываются по указателям param_ptrs, при этом длина макс 14 символов не проверяется!

После посылки строки
"1 2 3 123456789012345123456789012345678\x28\x01\"<CR><LF>
можно посылать команды бутлоадеру без ограничений.
(строка состоит из 39 символов, потом идет символ с кодом 0x28, символ с
кодом 0x01 и как любая команда завершается символами 13 10)
в ответ бутлоадер пришлет ответ 1 (INVALID COMMAND), но один из указателей, указывающий на буфер в который разбирается команда, будет указывать на переменную, которая хранит флаг защиты и следующей командой он будет затерт.
И следующей командой можно без проблем считать весь флеш!

Решение проблемы:
я подправил функцию разбора строки на параметры, при этом что бы было как можно меньше изменений пришлось пожертововать проверкой разделения параметров несолкькими пробелами
вот то что я изменил

Код
        CODE16
_parse_cmd                            ; CODE XREF: sub_400006BC+32p
                PUSH    {R4-R7}
                MOV     R12, R3
                LDRB    R3, [R0]
                MOV     R6, #0
                MOV     R4, #0
                CMP     R3, #0
                BNE     loc_4000120E
_e0:// вспомогательная метка                                
                MOV     R0, #0

loc_4000120A                          ; CODE XREF: _parse_cmd+4Aj
                POP     {R4-R7}
                BX      LR
; ---------------------------------------------------------------------------

loc_4000120E                          ; CODE XREF: _parse_cmd+Cj
                MOV     R5, #0
                B       loc_4000123E
; ---------------------------------------------------------------------------

loc_40001212                          ; CODE XREF: _parse_cmd+46j
                ADD     R3, R4, #1
                CMP     R3, R12
                BEQ     loc_40001242
                LDRB    R7, [R0,R5]
                CMP     R7, #0x20
                BEQ     loc_40001228
                LSL     R3, R4, #2
                LDR     R3, [R2,R3]
                STRB    R7, [R3,R6]
                ADD     R6, #1
                        cmp     R6, #15  // эти строки я добавил
                  bhs     _e0         //  добавлено
                B       loc_4000123C
; ---------------------------------------------------------------------------

loc_40001228                          ; CODE XREF: _parse_cmd+22j
                //ADD     R7, R0, R5      а эти удалил
                //LDRB    R7, [R7,#1]     и эту удалил
                nop//CMP     R7, #0x20       замена на NOP
                nop//BEQ     loc_4000123C   чтобы не изменилась длина
                LSL     R4, R4, #2
                LDR     R4, [R2,R4]
                MOV     R7, #0
                STRB    R7, [R4,R6]
                ADD     R4, R3, #0
                MOV     R6, #0

loc_4000123C                          ; CODE XREF: _parse_cmd+2Cj
                                      ; _parse_cmd+34j
                ADD     R5, #1

loc_4000123E                          ; CODE XREF: _parse_cmd+16j
                CMP     R5, R1
                BLE     loc_40001212

loc_40001242                          ; CODE XREF: _parse_cmd+1Cj
                ADD     R0, R4, #1
                B       loc_4000120A
; End of function _parse_cmd


В HEX файле апдейта бутлоадера изменилось 3 строчки

стока 34
Код
была
:1004000080C01FE040E0FF7F91A4D3D5EC04004002
стала
:1004000080C01FE040E0FF7F4F5C1D02EC04004015

здесь поменялалась контрольная сумма (используется при апдейте, для проверки)

И две строчки 259 и 260
Код
были
:1012100015E0631C634514D0475D202F04D0A30064
:10122000D3589F55013609E047197F78202F05D004
стали
:1012100015E0631C634514D0475D202F06D0A30062
:10122000D3589F55761C0F2EEED207E0C046C0461D

собственно сами изменения

Если кому нужно, прилагаю исправленный файл

Сделан на основе версии 1.63, к сожалению апдейта 1.64 нету

Сообщение отредактировал KRS - May 3 2007, 13:36
Прикрепленные файлы
Прикрепленный файл  patched_bootloader_update_ver_1_63_LPC_2114_2124_2119_2129_2194_2212_2214_2292_2294.rar ( 8.63 килобайт ) Кол-во скачиваний: 93
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016