- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
int hardinfo_updata( struct UPINFO * headinfo, struct HARDINFO * hardinfo )
{
char sbuf[128] ;
int sn_len = 0 ;
char *psn ;
printf("%s\n",__FUNCTION__ ) ;
memset( sbuf, 0xFF, 128 ) ;
if( strcmp( hardinfo->flag, "hardinfo") != 0 )
{
psn = (char *)hardinfo ;
sn_len = *psn ;
psn += 1;
memcpy( sbuf, psn , 127 ) ;
}
else
{
sn_len = hardinfo->sn_len ;
memcpy(sbuf, hardinfo->sn, 128 ) ;
}
memcpy( hardinfo, &(headinfo->hardinfo), sizeof( struct HARDINFO ) ) ;
hardinfo->sn_len = sn_len ;
if( hardinfo->sn_len > 128 ) hardinfo->sn_len = 128 ;
memcpy( hardinfo->sn, sbuf, hardinfo->sn_len ) ;
memset( 0x30008000, 0xFF, 0x20000 ) ;
memcpy( 0x30008000, hardinfo, sizeof( struct HARDINFO ) ) ;
memset( sbuf, 0xFF, 128 ) ;
sprintf( sbuf, "%s %x %x\0", "nand erase 80000 80000 ;nand write 0x30008000", 0x80000, 0x20000) ;
run_command( sbuf,0);
memset( sbuf, 0, 128 ) ;
sprintf( sbuf, "%s %x\0", "nand read 0x31000000 80000 ", 0x20000 ) ;
run_command(sbuf, 0 ) ;
if( memcmp( 0x30008000, 0x31000000, sizeof( struct HARDINFO) ) != 0 )
{
printf("bootloader data crc error\n") ;
return 0 ;
}
else
{
printf("update hardinfo is ok\n") ;
}
return 1 ;
}
CRC через memcpy. Из пропатченного китайцами u-boot
Вот у меня сразу в мозгу триггернулось: "ага, в верхней ветке psn заполнили, а в нижней - нет, если внизу её заюзают - всё распидорасит... а, не юзают, ну и слава богу".
а мне нравится)
сразу представляю себя таким юникс хакером за PDP в больших очках, клечатой рубашке и с бородой
Смотрит на таких хипстеров с неодобрением
Потому что заедушные сишкобляди?
Ну а если кешируется, и мы там можем увидеть кусок старых данных от старой прошивки - ну тут только какой-то системнозависимой инструкцией кеш прочищать... memcmp не виноватый, тут совершенно любая проверка обосрётся.
Ну если сделать нечто вроде
То все должно пройти гладко. Вообще, я не особо курил код этого u-boot, может таких извратов делать не надо
Ну здесь же именно так и делают :)
З.Ы run_command() это чё-то типа system()?
так как у-буут стартует рано, и как правило архитектура известна, то и лэйаут памяти тоже известен - почему в у-бууте использование фиксированых хардкоженых адресов памяти (0x30008000, 0x31000000) и популярно.
код на самом деле не так плох. учитывая что писали хардварщики - так почти идеал. и сообщение об ошибке и не так плохо: можно было бы "consistency check" написать - но типичные пользователи уже знают CRC ошибки, и просто не имеет смысл их грузить деталями. в конце концов, CRC это дешевая имитация memcmp().
Ты лучше объясни, зачем там memset на 0xFF
Иногда тупо выгодней сделать
и потом заполнить payload, чем
Особенно если payload состоит из 20 байт, ибо по Стандарту, unused bytes shall be set to 0xFF.
З.Ы. Я понимаю, зачем это делается с бинарными данными.
Reserved for chinese backdoor :^)
может копипаситили memset из другого места в коде. некоторые флеши перед программированием надо в 0xFF ставить.
Видимо вот отсюда пробралось.
Ну скорее просто чтобы не дрочить хвост флешки лишними переключениями 1 -> 0. 0xFF один хер получается только после отдельной команды стирания...
А NOR/NAND - как соединены между собой ячейки. В NOR параллельно (wired-or) и можно любой бит зарядить независимо, но плотность хуёвая, получаются от силы мегабайты. В NAND'е - последовательно (wired-and), поэтому можно записать только всю цепочку разом (единички маскируются, нолики заряжаются), зато лишнего обвеса минимум, можно делать гигабайтные флехи.
А выкачивается заряд (забиваются единички) в обоих типах только большими блоками...
Даже если и так, sprintf не будет разбирать строку дальше нуля. Китайцы вероятно решили, что чтобы в буфер попал ноль в конце, надо обязательно "\0" добавить в конце строки скармливаемой этому sprintf, а иначе там сразу после текста полезут эти 0xFF
элементарно заменяется на:
> char sbuf[заранее_угадай] ;
Как я сука ненавижу сишколибу для строк
Можно подумать, что в пасцале не так, когда куча недоступна и строки надо на стеке объявлять.
256, разве нет?
http://ideone.com/0fJrLY
От каких кодов?
Уязвимость?
Своё говно?
Искусственно сделанный тест?
http://risovach.ru/upload/2015/12/mem/palki-v-kolesa_99340943_orig_.jpg
Доступ к запрашиваемому Вами Интернет-ресурсу ограничен в
соответствии с требованиями законодательства и/или во исполнение
решения суда.
И
Д
О
Р
А
Х
А
0
2
4
-
-