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

 
 
> Дырка в 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
 
Start new topic
Ответов
KRS
сообщение May 14 2007, 11:07
Сообщение #2


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

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



Сегодня на плату поставили LPC2129 из новой поставки, так там версия бутлоадера 1.65 в котором эта бага поправлена!
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 14 2007, 12:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KRS @ May 14 2007, 14:07) *
Сегодня на плату поставили LPC2129 из новой поставки, так там версия бутлоадера 1.65 в котором эта бага поправлена!

Уже 1.66 сваяли.
Новая фича:
Code Read Protection is a mechanism that allows user to enable different levels of
security in the system so that access to the on-chip Flash and use of the ISP can be
restricted. When needed, CRP is invoked by programming a specific pattern in Flash
location at 0x000001FC. IAP commands are not affected by the code read protection.
Three levels of CRP are implemented. CRP2 option is equivalent to CRP of previous
bootloader version.

И еще:
WRITE/ERASE SECURITY
In the NXP ARM based microcontroller, each flash sector can be secured against write/erase operation. This feature allows the application to secure the sensitive code/data against tempering. If the Code Read Protection feature is enabled then the sensitive code/data is also protected against unauthorized reads.

Сообщение отредактировал zltigo - May 14 2007, 13:02
Прикрепленные файлы
Прикрепленный файл  boot.loader.lpc2109.lpc2114.lpc2124.lpc2119.lpc2129.lpc2194.lpc2212.lpc2214.lpc2292.lpc2294.zip ( 159.86 килобайт ) Кол-во скачиваний: 2370
 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KRS
сообщение May 14 2007, 14:07
Сообщение #4


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

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



Цитата(zltigo @ May 14 2007, 16:54) *
Уже 1.66 сваяли.
Новая фича:
Code Read Protection is a mechanism that allows user to enable different levels of
security in the system so that access to the on-chip Flash and use of the ISP can be
restricted. When needed, CRP is invoked by programming a specific pattern in Flash
location at 0x000001FC. IAP commands are not affected by the code read protection.
Three levels of CRP are implemented. CRP2 option is equivalent to CRP of previous
bootloader version.

Спасибо за апдейт!!!

А в 1.65 тоже есть такие константы, в коде видел.
А где вы сам update нашли?
А то у NXP на сайте часто пробематично свежие документы найти.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 14 2007, 14:13
Сообщение #5


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

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



Цитата(KRS @ May 14 2007, 18:07) *
Спасибо за апдейт!!!

А в 1.65 тоже есть такие константы, в коде видел.
А где вы сам update нашли?
А то у NXP на сайте часто пробематично свежие документы найти.


Отвечу сам себе!
на NXP надо заходить и через
http://www.standardics.nxp.com/
там другие догументы выложены smile.gif
Go to the top of the page
 
+Quote Post



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

 


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


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