Как я уже говрил, и здесь раньше обсуждали.
В весиях 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