Tani waa qaybtii labaad ee ugu dambaysay ee maqaalka ku saabsan jabsiga dibadeed is-encrypting drives. Aan ku xasuusiyo in saaxiibkiis uu dhawaan ii keenay Patriot (Aigo) SK8671 hard drive, waxaanan go'aansaday inaan beddelo, oo hadda waxaan la wadaagayaa wixii ka soo baxay. Intaadan wax sii akhriyin, hubi inaad akhrido qaybta koowaad qodobbada.
Markaa, wax walbaa waxay muujinayaan (sida aan ku dhisnay [qaybta koowaad]()) in koodhka sirta ah lagu kaydiyo qoto dheer ee PSoC. Sidaa darteed, waxaan u baahannahay inaan akhrino qoto-dheeraantaas. Hore ee shaqada lagama maarmaanka ah:
la xakameyso "xidhiidhka" kantaroolka yar;
hel hab aad ku hubiso in "xidhiidhka" uu ka ilaaliyo wax akhrinta dibadda;
raadso hab aad kaga gudubto ilaalinta.
Waxaa jira laba meelood oo ay macno samaynayso in la raadiyo koodka PIN sax ah:
xusuusta gudaha gudaha;
SRAM, halkaas oo koodhka biinanka lagu kaydin karo si loo barbar dhigo koodhka pin-ka ee isticmaaluhu galo.
Anigoo horay u eegaya, waxaan ogaan doonaa inaan wali ku guuleystey inaan daadiyo gudaha gudaha PSoC flash drive - anigoo ka gudbaya nidaamkeeda amniga anigoo adeegsanaya weerarka qalabka loo yaqaan "raadinta kabaha qabow" - ka dib markii aan dib u rogay awoodaha aan diiwaangashanayn ee nidaamka ISSP. Tani waxay ii ogolaatay inaan si toos ah u tuuro lambarka sirta ah ee dhabta ah.
$ ./psoc.py
syncing: KO OK
[...]
PIN: 1 2 3 4 5 6 7 8 9
Dhammaan xididdada waxay leeyihiin dherer isku mid ah: 22 bits. Dukumeentiga HSSP waxa ay hayaan macluumaad dheeraad ah oo ku saabsan ISSP: "Vektoor ISSP waa wax aan ka badnayn wax yar oo isku xigxiga oo ka dhigan tilmaamo."
5.2. Demystifying Vectors
Aynu ogaano waxa halkan ka socda. Markii hore, waxaan u qaatay in vectors-yadan la mid ah ay ahaayeen noocyada cayriin ee tilmaamaha M8C, laakiin ka dib markii aan hubiyay mala-awaalkan, waxaan ogaaday in opcodes-yada hawlgallada aysan ku habboonayn.
Ka dib waxaan google-ka galiyay vector-ka sare oo aan la kulmay tan Daraasad uu qoraagu, inkasta oo aanu tafaasiil ka bixin, haddana waxa uu soo jeedinayaa talooyin wax ku ool ah: βTilmaan kastaa waxa ay ku bilaabataa saddex xabbadood oo u dhiganta mid ka mid ah afar mnemonics (ka akhri RAM, ku qor RAM, akhri diiwaanka, qor diiwaanka). Ka dib waxaa jira 8 ciwaanka ciwaanka ah, oo ay ku xigto 8 data bits (akhri ama qor) iyo ugu dambeyntii saddex xabbadood oo joogsi ah."
Kadib waxaan awooday inaan ka soo ururiyo macluumaad aad waxtar u leh qaybta Kormeeraha ROM (SROM). buug-gacmeedka farsamada. SROM waa ROM adag oo ku jira PSoC kaas oo bixiya hawlaha utility (si la mid ah Syscall) ee code barnaamijka ku shaqeeya booska isticmaalaha:
00h:SWBootReset
01h: ReadBlock
02h: WriteBlock
03h: Tirtir xannibaad
06h: TableRead
07h: CheckSum
08h: Calibrate0
09h: Calibrate1
Marka la barbardhigo magacyada vector-ka iyo hawlaha SROM-ka, waxaan ku sawiri karnaa hawlgallada kala duwan ee uu taageerayo borotokoolka cabbirrada SROM-ka ee la filayo. Mahadsanid tan, waxaan go'aamin karnaa saddexda qaybood ee ugu horreeya ee vectors ISSP:
100 => "wrem"
101 => "rdmem"
110 => "qalad"
111 => "rdreg"
Si kastaba ha ahaatee, faham buuxa oo ku saabsan hababka Chip-ku waxa kaliya oo lagu heli karaa xiriir toos ah oo lala yeesho PSoC.
5.3. Xiriirinta PSoC
Tan iyo markii Dirk Petrautsky uu hore u lahaa xamaali Koodhka HSSP ee Cypress ee Arduino, waxaan isticmaalay Arduino Uno si aan ugu xidho xidhiidhiyaha ISSP ee sabuuradda kiiboodhka.
Fadlan ogow in intii aan cilmi-baadhista ku jiray, in aan waxoogaa beddelay koodka Dirk. Waxaad ka heli kartaa wax ka beddelkayga GitHub: halkan iyo qoraalka Python ee u dhigma ee lagula xidhiidho Arduino, ee ku jira kaydkayga cypress_psoc_tools.
Marka, anigoo isticmaalaya Arduino, waxaan markii hore u adeegsaday kaliya "rasmiga" vectors-ka "xidhiidhka". Waxaan isku dayay inaan akhriyo ROM-ka gudaha anigoo isticmaalaya amarka VERIFY. Sidii la filayey, ma awoodin inaan tan sameeyo. Waxay u badan tahay inay sabab u tahay xaqiiqda ah in kaydinta ilaalinta la akhriyo lagu hawlgeliyo gudaha flash-ka.
Ka dib waxaan abuuray dhowr ka mid ah vectors fudud oo aniga ii gaar ah si aan u qoro iyo akhriyo xusuusta/diwaangelinta. Fadlan ogow in aan akhrin karno SROM-ka oo dhan inkasta oo flash drive-ka la ilaaliyo!
5.4. Aqoonsiga diiwaannada-chip-ka
Ka dib markii aan eegay vectors "la furfuray", waxaan ogaaday in qalabku isticmaalo diiwaanada aan sharciyeysnayn (0xF8-0xFA) si loo caddeeyo M8C opcodes, kuwaas oo si toos ah loo fuliyo, iyada oo laga gudbayo ilaalinta. Tani waxay ii ogolaatay inaan ku shaqeeyo opcodes kala duwan sida "ADD", "MOV A, X", "PUSH" ama "JMP". Waad ku mahadsan tahay iyaga (adiga oo eegaya dhibaatooyinka ay ku leeyihiin diiwaanka) Waxaan awooday inaan go'aamiyo mid ka mid ah diiwaannada aan sharciyeysneyn ee dhab ahaantii diiwaanka caadiga ah (A, X, SP iyo PC).
Natiijo ahaan, koodka "la furfuray" ee uu soo saaray aaladda HSSP_disas.rb waxay u egtahay sidan (waxaan ku daray faallooyin si aan u caddeeyo):
Marxaladdan mar horeba waan la xiriiri karaa PSoC, laakiin weli ma hayo macluumaad la isku halleyn karo oo ku saabsan qaybaha amniga ee flash-ka. Waxaan aad ula yaabay xaqiiqda ah in Cypress uusan siinin isticmaalaha qalabka si kasta oo uu u hubiyo in ilaalintu ay shaqeyso. Waxaan si qoto dheer u sii galay Google si aan ugu dambeyntii u fahmo in HSSP code-ka ay bixiso Cypress la cusboonaysiiyay ka dib markii Dirk uu sii daayay beddelkiisa. Oo sidaas! Waxa soo muuqday faytarkan cusub:
Isticmaalka vector-kan (eeg read_security_data in psoc.py), waxaan helnaa dhammaan qaybaha amniga ee SRAM 0x80, halkaas oo ay jiraan laba bits halkii baloog la ilaaliyo.
Natiijadu waa niyad jab: wax walba waxaa lagu ilaaliyaa habka "dami akhrinta iyo qorista dibadda". Sidaa darteed, ma aha oo kaliya inaanan waxba ka akhriyin flash drive, laakiin ma qori karno midkoodna (tusaale ahaan, in lagu rakibo qashinka ROM halkaas). Habka kaliya ee lagu joojin karo ilaalinta waa in gebi ahaanba la tirtiro dhammaan jajabka. π
6. Weerarkii ugu horeeyay (fashilmay): ROMX
Si kastaba ha ahaatee, waxaan isku dayi karnaa khiyaamadan soo socota: maadaama aan awood u leenahay inaan fulino opcodes aan sabab lahayn, maxaa diidaya in la fuliyo ROMX, kaas oo loo isticmaalo akhrinta xusuusta flash? Habkani wuxuu leeyahay fursad wanaagsan oo lagu guuleysto. Sababtoo ah shaqada ReadBlock ee akhrinaysa xogta SROM-ka (oo ay isticmaalaan vectors) waxay hubiyaan in laga soo wacay ISSP iyo in kale. Si kastaba ha ahaatee, ROMX opcode si macquul ah ma lahaan karo jeeg noocaas ah. Markaa waa kan koodka Python (ka dib markii lagu daro dhawr fasal oo caawiye koodka 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
Nasiib darro koodkan ma shaqeeyo. π Ama waa ay shaqeysaa, laakiin wax soo saarka waxaan helnaa opcodes noo gaar ah (0x28 0x30 0x40)! Uma maleynayo in shaqeynta u dhiganta ee qalabku ay tahay shay ka mid ah ilaalinta akhrinta. Tani waxay u badan tahay sida farsamada injineernimada: marka la fulinayo opcodes dibadda ah, baska ROM-ka waxaa loo jiheeyaa kayd ku meel gaar ah.
Tani waxay asal ahaan ugu yeertaa shaqada SROM 0x07, sida lagu soo bandhigay dukumeentiyada (talics mine):
Xaqiijinta hubinta shaqadan Waxay xisaabinaysaa jeegga 16-bit ee tirada blocks ee isticmaala-qeexay ee hal bangi oo flash ah, laga bilaabo eber. Halbeegga BLOCKID waxaa loo isticmaalaa in lagu dhaafo tirada baloogyada la isticmaali doono marka la xisaabinayo xisaabinta jeegga. Qiimaha "1" wuxuu kaliya xisaabin doonaa jeegagga eber; halka "0" waxay keeni doontaa in la xisaabiyo wadarta jeegaga dhammaan 256 baloog ee bangiga flash-ka. Jeegaga 16-bit waxaa lagu soo celiyaa KEY1 iyo KEY2. Halbeegga KEY1 waxa uu kaydiyaa dalabka hoose ee 8 ee jeegagga, iyo halbeegga KEY2 waxa uu kaydiyaa dalabka sare ee 8. Aaladaha leh dhowr bangi oo fiish ah, shaqada jeegagga ayaa mid walba si gaar ah loogu yeeraa. Lambarka bangiga ee uu ku shaqayn doono waxaa dejiya diiwaanka FLS_PR1 (adiga oo dejinaya inyar oo ku jirta oo u dhiganta bangiga bartilmaameedka).
Ogsoonow in tani ay tahay xisaab hubin fudud: bytes ayaa si fudud loogu daray midba midka kale; ma jiro CRC cajiib ah. Intaa waxaa dheer, anigoo og in xudunta M8C ay leedahay diiwaangelin aad u yar, waxaan u qaatay in marka la xisaabinayo jeegga, qiimaha dhexdhexaadka ah lagu qori doono doorsoomayaal isku mid ah oo ugu dambeyntii aadi doona wax soo saarka: KEY1 (0xF8) / KEY2 ( 0xF9).
Markaa aragti ahaan weerarkaygu wuxuu u eg yahay sidan:
Waxaan ku xirnay ISSP.
Waxaan ku bilownaa xisaabinta jeegaga anagoo adeegsanayna CHECKSUM-SETUP vector.
Waxaan dib u kicinay processor-ka ka dib waqti cayiman T.
Waxaan akhrinay RAM si aan u helno jeegga hadda C.
Ku celi tillaabooyinka 3 iyo 4, kordhinta T wax yar mar kasta.
Waxaan ka soo kabsaneynaa xogta flash-ka anagoo ka jarnay jeeggii hore C kan hadda jira.
Si kastaba ha ahaatee, waxaa jirta dhibaato: Initialize-1 vector oo ay tahay in aan dirno ka dib dib-u-kicinta KEY1 iyo KEY2:
Ku socodsii xisaabinta jeegagga (send_checksum_v).
Sug wakhti cayiman; iyada oo la tixgelinayo dhibaatooyinka soo socda:
Waqti badan ayaa iga lumiyay ilaa aan ogaaday waxa ku soo baxay daahitaanka Microsecond u shaqeeya si sax ah kaliya dib u dhac aan ka badnayn 16383 ΞΌs;
ka dibna mar kale dilay isla wakhtigaas ilaa aan ogaaday in daahitaankaMicroseconds, haddii 0 loo gudbiyo sida wax gelinta, si buuxda u shaqeeyaa si khaldan!
Koodhkan waxa la fuliyaa 10 jeer 1 micro seconds. 0xF1 ayaa halkan lagu soo daray sababtoo ah waxay ahayd diiwaanka kaliya ee bedelay marka la xisaabinayo jeegga. Waxaa laga yaabaa inay tahay nooc ka mid ah doorsoomayaasha ku meel gaadhka ah ee loo isticmaalo unugga macquulka ah ee xisaabtu. Ogsoonow jabsiga foosha xun ee aan u isticmaalo dib-u-dejinta Arduino anigoo isticmaalaya picocom marka Arduino joojiyo muujinta calaamadaha nolosha (ma jiraan wax fikrad ah sababta).
7.2. Akhrinta natiijada
Natiijada qoraalka Python waxay u egtahay sidan (loo fududeeyay in la akhriyo):
Taas marka la dhaho, dhib ayaa naga haysata: maadaama aan ku shaqaynayno jeegag dhab ah, byte-ka null ma beddelo qiimaha akhrinta. Si kastaba ha ahaatee, maadaama habka xisaabinta oo dhan (8192 bytes) ay qaadato 0,1478 ilbiriqsi (oo leh kala duwanaansho yar mar kasta oo la ordo), taas oo u dhiganta ku dhawaad ββ18,04 ΞΌs per byte, waxaan isticmaali karnaa wakhtigan si aan u hubinno qiimaha jeegga wakhtiyada ku habboon. Hawlaha ugu horreeya, wax walba si fudud ayaa loo akhriyaa, maadaama muddada nidaamka xisaabinta ay had iyo jeer ku dhowdahay isku mid. Si kastaba ha ahaatee, dhamaadka qashin-qubkani waa mid sax ah sababtoo ah "waqtiga yar ee leexashada" ee orod kasta ayaa isku darka inay noqdaan kuwo muhiim ah:
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
Wali maan dhamaystirin qorista koodka kaas oo si buuxda dib u dhisi doona koodhka barnaamijka ee flash-ka, iyadoo la tixgalinayo mar kasta oo weecan. Si kastaba ha ahaatee, waxaan mar hore soo celiyay bilawga koodkan. Si aan u hubiyo inaan si sax ah u sameeyay, waxaan kala furfuray anigoo isticmaalaya 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
Waxay u egtahay mid macquul ah!
7.4. Helitaanka cinwaanka kaydinta koodka PIN
Hadda oo aan akhrin karno jeegagga wakhtiyada aan u baahanahay, waxaan si fudud u hubin karnaa sida iyo meesha ay isku beddesho markaan:
geli lambarka sirta ah ee khaldan;
Beddel furka koodka.
Marka hore, si aan u helo ciwaanka kaydinta qiyaastii, waxaan qaaday qashin-qubka jeegaga 10 ms kordhinta kadib dib-u-kicinta. Kadibna waxaan galay PIN khaldan oo aan sameeyay.
Natiijadu ma ahayn mid aad u faraxsan, maadaama ay jiraan isbeddello badan. Laakin ugu danbayntii waxaan awooday in aan ogaado in jeeggu is badalay meel u dhaxaysa 120000 Β΅s iyo 140000 Β΅s oo daahitaan ah. Laakiin "pincode" ee aan ku soo bandhigay halkaas gabi ahaanba wuu khaldanaa - sababtoo ah artifact ee habraaca daahitaankaMicrosecond, kaas oo sameeya waxyaabo yaab leh marka 0 loo gudbiyo.
Dabadeed, ka dib markii aan qaatay ku dhawaad ββ3 saacadood, waxaan xusuustay in nidaamka SROM-ka ee wac CheckSum uu helo dood ahaan gelinta taas oo qeexaysa tirada baloogyada jeeggaga! Taasi. Waxaan si fudud u meel dhigi karnaa ciwaanka kaydinta ee koodhka sirta ah iyo miiska "isku dayo khaldan" oo sax ah ilaa 64-byte block.
Orodkeygii ugu horreeyay wuxuu keenay natiijada soo socota:
Kadibna waxaan ka bedelay lambarka sirta ah ee "123456" una beddelay "1234567" oo aan helay:
Haddaba, furaha sirta ah iyo miiska isku-dayga khaldan waxay u muuqdaan inay ku kaydsan yihiin qaybta lambarka 126.
7.5. Qaadashada qashinka baloogga No. 126
Block #126 waa inuu ku yaal meel ku dhow 125x64x18 = 144000ΞΌs, laga bilaabo bilawga xisaabinta jeegga, qashinkayga buuxa, waxayna u egtahay mid macquul ah. Kadib, ka dib markii aan gacanta ku shaandheeyay qashin qubyo badan oo aan ansax ahayn (sababtoo ah isu-ururinta "waqtiga yar-dhaafka ah"), waxaan ku dhammeeyey helitaanka baytyadan (xilliga 145527 ΞΌs):
Way iska caddahay in lambarka sirta ah uu ku kaydsan yahay qaab aan qarsoodi ahayn! Qiimayaashan, dabcan, kuma qorna koodka ASCII, laakiin sida ay soo baxday, waxay ka tarjumaysaa akhrinta laga soo qaatay kiiboodhka awoodda leh.
Ugu dambayntii, waxa aan sameeyay baadhitaano kale si aan u ogaado halka lagu kaydiyay miiska isku dayga xun. Waa kan natiijada:
0xFF - macneheedu waa "15 isku day" waxayna hoos u dhigtaa isku day kasta oo fashilmay.
Fadlan ogow in qiimayaasha daahitaanka ee aan isticmaalay ay u badan tahay inay khuseeyaan hal PSoC gaar ah - kii aan isticmaalay.
8. Maxaa xiga?
Haddaba, aan ku soo koobno ββdhinaca PSoC, macnaha guud ee wadista Aigo:
SRAM waan akhrin karnaa xitaa haddii la akhriyo iyadoo la ilaalinayo;
Waxaan ka gudbi karnaa ilaalinta ka-hortagga dhaq-dhaqaaqa anagoo adeegsanayna weerarka raadraaca bootka qabow oo si toos ah u akhrinaya lambarka sirta ah.
Si kastaba ha ahaatee, weerarkayagu waxa uu leeyahay cillado ay ugu wacan tahay dhibaatooyinka wada shaqaynta. Waxaa lagu hagaajin karaa sida soo socota:
qor utility si aad si sax ah u qeexdo xogta wax soo saarka ee la helay iyada oo ay sabab u tahay weerarka "raafka kabaha qabow";
adeegso aaladda FPGA si aad u abuurto dib-u-dhac sax ah oo dheeri ah (ama isticmaal saacadaha qalabka Arduino);
isku day weerar kale: Geli koodhka sirta ah ee khaldan si ula kac ah, reboot oo tuur RAM, adoo rajaynaya in lambarka sirta ah ee saxda ah lagu kaydin doono RAM marka la barbardhigo. Si kastaba ha ahaatee, tani ma fududa in lagu sameeyo Arduino, maadaama heerka calaamada Arduino uu yahay 5 volts, halka guddiga aan baaraynaa ay ku shaqeeyaan calaamadaha 3,3 volt.
Hal shay oo xiiso leh oo la isku dayi karo ayaa ah in lagu ciyaaro heerka korantada si looga gudbo ilaalinta akhrinta. Haddii habkani shaqeynayo, waxaan awood u yeelan karnaa inaan ka helno xogta saxda ah ee flash-ka - halkii aan ku tiirsanaan lahayn akhrinta jeegagga ee leh dib-u-dhac aan sax ahayn.
Maadaama SROM-ku ay u badan tahay inuu akhriyo qaniinyada waardiyaha isagoo adeegsanaya nidaamka ReadBlock, waxaan samayn karnaa wax la mid ah sida lagu tilmaamay on blog Dmitry Nedospasov - dib u dhaqangelinta weerarkii Chris Gerlinski, oo lagu dhawaaqay shirka "REcon Brussels 2017".
Waxyaabo kale oo xiiso leh oo la samayn karo waa in kiiska laga gooyo chip: in la qaado qashinka SRAM, la ogaado wicitaanada nidaamka aan sharciyeysneyn iyo dayacanka.
9. Gunaanad
Marka, ilaalinta darawalkan ayaa wax badan ka tagaya in la rabo, sababtoo ah waxay isticmaashaa microcontroller joogto ah (ma aha "adag") si ay u kaydiso koodhka PIN-ka ... Plus, ma aan eegin (wali) sida ay wax u socdaan xogta sirta qalabkan!
Maxaad ku talin kartaa Aigo? Ka dib markii aan falanqeeyay dhowr nooc oo ah darawallada HDD sir ah, 2015 ayaan sameeyay bandhigid on SyScan, kaas oo uu ku baadhay dhibaatooyinka amniga ee dhowr drives HDD dibadda ah, oo uu ku taliyay waxa lagu hagaajin karo iyaga. π
Waxaan ku qaatay laba toddobaad oo axad ah iyo dhawr habeenimo oo aan cilmi-baadhistan sameeyay. Wadar ahaan ilaa 40 saacadood. Tirinta bilawgii hore (marka aan furay saxanka) ilaa dhamaadka (qashin koodka PIN). Isla 40-ka saacadood waxa ku jira wakhtiga aan ku qaatay qorista maqaalkan. Wuxuu ahaa safar aad u xiiso badan.