புரோஹோஸ்டர் > Блог > நிர்வாகம் > ஐகோ சுய-குறியாக்க வெளிப்புற HDD டிரைவை மாற்றுதல் மற்றும் ஹேக்கிங் செய்தல். பகுதி 2: சைப்ரஸ் பிஎஸ்ஓசியிலிருந்து டம்ப் எடுப்பது
ஐகோ சுய-குறியாக்க வெளிப்புற HDD டிரைவை மாற்றுதல் மற்றும் ஹேக்கிங் செய்தல். பகுதி 2: சைப்ரஸ் பிஎஸ்ஓசியிலிருந்து டம்ப் எடுப்பது
வெளிப்புற சுய-குறியாக்க டிரைவ்களை ஹேக்கிங் செய்வது பற்றிய கட்டுரையின் இரண்டாவது மற்றும் இறுதிப் பகுதி இது. சமீபத்தில் ஒரு சக ஊழியர் எனக்கு ஒரு பேட்ரியாட் (Aigo) SK8671 ஹார்ட் டிரைவைக் கொண்டுவந்தார் என்பதை உங்களுக்கு நினைவூட்டுகிறேன், அதை மாற்றியமைக்க முடிவு செய்தேன், இப்போது அதில் வந்ததைப் பகிர்கிறேன். மேலும் படிக்கும் முன், கண்டிப்பாக படிக்கவும் முதல் பகுதி கட்டுரை.
4. உள் PSoC ஃபிளாஷ் டிரைவிலிருந்து ஒரு டம்ப் எடுக்கத் தொடங்குகிறோம்
எனவே, PIN குறியீடு PSoC இன் ஃபிளாஷ் ஆழத்தில் சேமிக்கப்பட்டிருப்பதை எல்லாம் ([முதல் பகுதியில்]() நிறுவியது போல்) குறிக்கிறது. எனவே, இந்த ஒளிரும் ஆழங்களை நாம் படிக்க வேண்டும். தேவையான வேலையின் முன்:
மைக்ரோகண்ட்ரோலருடன் "தொடர்பு" கட்டுப்பாட்டை எடுத்துக் கொள்ளுங்கள்;
இந்த "தொடர்பு" வெளியில் இருந்து படிக்காமல் பாதுகாக்கப்படுகிறதா என்பதைச் சரிபார்க்க ஒரு வழியைக் கண்டறியவும்;
பாதுகாப்பைத் தவிர்ப்பதற்கான வழியைக் கண்டறியவும்.
சரியான PIN குறியீட்டைத் தேடுவது அர்த்தமுள்ளதாக இருக்கும் இரண்டு இடங்கள் உள்ளன:
உள் ஃபிளாஷ் நினைவகம்;
SRAM, பின் குறியீட்டை பயனர் உள்ளிட்ட பின் குறியீட்டுடன் ஒப்பிட்டுச் சேமிக்க முடியும்.
முன்னோக்கிப் பார்க்கையில், ISSP நெறிமுறையின் ஆவணப்படுத்தப்படாத திறன்களை மாற்றியமைத்த பிறகு, "கோல்ட் பூட் டிரேசிங்" எனப்படும் வன்பொருள் தாக்குதலைப் பயன்படுத்தி அதன் பாதுகாப்பு அமைப்பைத் தவிர்த்து, இன்டர்னல் PSoC ஃபிளாஷ் டிரைவை நான் இன்னும் எடுக்க முடிந்தது என்பதை நான் கவனிக்கிறேன். உண்மையான பின் குறியீட்டை நேரடியாக டம்ப் செய்ய இது என்னை அனுமதித்தது.
$ ./psoc.py
syncing: KO OK
[...]
PIN: 1 2 3 4 5 6 7 8 9
மைக்ரோகண்ட்ரோலருடன் “தொடர்பு” என்பது வெவ்வேறு விஷயங்களைக் குறிக்கும்: “விற்பனையாளர் முதல் விற்பனையாளர் வரை” தொடர் நெறிமுறையைப் பயன்படுத்தி தொடர்பு கொள்வது வரை (எடுத்துக்காட்டாக, மைக்ரோசிப்பின் PICக்கான ICSP).
சைப்ரஸுக்கு அதன் சொந்த தனியுரிம நெறிமுறை உள்ளது, இது ISSP (இன்-சிஸ்டம் சீரியல் புரோகிராமிங் புரோட்டோகால்) என்று அழைக்கப்படுகிறது, இது பகுதியளவில் விவரிக்கப்பட்டுள்ளது. தொழில்நுட்ப விவரக்குறிப்பு. காப்புரிமை US7185162 சில தகவல்களையும் தருகிறது. HSSP எனப்படும் OpenSource சமமான ஒன்றும் உள்ளது (இதை சிறிது நேரம் கழித்துப் பயன்படுத்துவோம்). ISSP பின்வருமாறு செயல்படுகிறது:
PSoC ஐ மீண்டும் துவக்கவும்;
இந்த PSoC இன் தொடர் தரவு பின்னுக்கு மேஜிக் எண்ணை வெளியிடவும்; வெளிப்புற நிரலாக்க முறையில் நுழைய;
கட்டளைகளை அனுப்பவும், அவை "வெக்டர்கள்" எனப்படும் நீண்ட பிட் சரங்களாகும்.
ISSP ஆவணங்கள் இந்த திசையன்களை ஒரு சில கட்டளைகளுக்கு மட்டுமே வரையறுக்கிறது:
அனைத்து திசையன்களுக்கும் ஒரே நீளம் உள்ளது: 22 பிட்கள். HSSP ஆவணத்தில் ISSP பற்றிய சில கூடுதல் தகவல்கள் உள்ளன: "ஒரு ISSP திசையன் என்பது அறிவுறுத்தல்களின் தொகுப்பைக் குறிக்கும் ஒரு பிட் வரிசையைத் தவிர வேறில்லை."
5.2 வெக்டர்களை நீக்குதல்
இங்கே என்ன நடக்கிறது என்பதைக் கண்டுபிடிப்போம். ஆரம்பத்தில், இதே திசையன்கள் M8C வழிமுறைகளின் மூல பதிப்புகள் என்று நான் கருதினேன், ஆனால் இந்த கருதுகோளைச் சரிபார்த்த பிறகு, செயல்பாடுகளின் ஆப்கோட்கள் பொருந்தவில்லை என்பதைக் கண்டுபிடித்தேன்.
பிறகு மேலே உள்ள வெக்டரை கூகிள் செய்து பார்த்தேன் இது ஒரு ஆய்வு, அவர் விரிவாகச் செல்லவில்லை என்றாலும், சில பயனுள்ள உதவிக்குறிப்புகளை வழங்குகிறார்: “ஒவ்வொரு அறிவுறுத்தலும் நான்கு நினைவூட்டல்களில் ஒன்றை ஒத்த மூன்று பிட்களுடன் தொடங்குகிறது (ரேமில் இருந்து படிக்கவும், ரேமில் எழுதவும், பதிவைப் படிக்கவும், பதிவேட்டை எழுதவும்). பின்னர் 8 முகவரி பிட்கள் உள்ளன, அதைத் தொடர்ந்து 8 தரவு பிட்கள் (படிக்க அல்லது எழுதுதல்) மற்றும் இறுதியாக மூன்று நிறுத்த பிட்கள் உள்ளன.
மேற்பார்வை ரோம் (SROM) பிரிவில் இருந்து சில பயனுள்ள தகவல்களை என்னால் சேகரிக்க முடிந்தது. தொழில்நுட்ப கையேடு. SROM என்பது PSoC இல் உள்ள கடின-குறியிடப்பட்ட ROM ஆகும், இது பயனர் இடத்தில் இயங்கும் நிரல் குறியீட்டிற்கான பயன்பாட்டு செயல்பாடுகளை (Syscalll ஐப் போன்றது) வழங்குகிறது:
00h:SWBootReset
01h: ReadBlock
02h: WriteBlock
03h: EraseBlock
06 மணி: டேபிள் ரீட்
07h: செக்சம்
08h: அளவீடு 0
09h: அளவீடு 1
வெக்டார் பெயர்களை SROM செயல்பாடுகளுடன் ஒப்பிடுவதன் மூலம், இந்த நெறிமுறையால் ஆதரிக்கப்படும் பல்வேறு செயல்பாடுகளை எதிர்பார்க்கப்படும் SROM அளவுருக்களுக்கு நாம் வரைபடமாக்க முடியும். இதற்கு நன்றி, ISSP வெக்டர்களின் முதல் மூன்று பிட்களை டிகோட் செய்யலாம்:
100 => “ரெம்”
101 => “rdmem”
110 => “wrreg”
111 => “rdreg”
இருப்பினும், ஆன்-சிப் செயல்முறைகள் பற்றிய முழுமையான புரிதலை PSoC உடனான நேரடி தொடர்பு மூலம் மட்டுமே பெற முடியும்.
5.3 PSoC உடனான தொடர்பு
டிர்க் பெட்ராட்ஸ்கி ஏற்கனவே இருப்பதால் துறைமுகம் Arduino இல் சைப்ரஸின் HSSP குறியீடு, கீபோர்டு போர்டின் ISSP இணைப்பியுடன் இணைக்க Arduino Uno ஐப் பயன்படுத்தினேன்.
எனது ஆராய்ச்சியின் போது, நான் டிர்க்கின் குறியீட்டை சிறிது மாற்றினேன் என்பதை நினைவில் கொள்ளவும். GitHub இல் எனது மாற்றத்தை நீங்கள் காணலாம்: இங்கே என் களஞ்சியத்தில் Arduino உடன் தொடர்புகொள்வதற்கான தொடர்புடைய பைதான் ஸ்கிரிப்ட் cypress_psoc_tools.
எனவே, Arduino ஐப் பயன்படுத்தி, நான் முதலில் "தொடர்புக்கு" "அதிகாரப்பூர்வ" திசையன்களை மட்டுமே பயன்படுத்தினேன். VERIFY கட்டளையைப் பயன்படுத்தி உள் ROM ஐப் படிக்க முயற்சித்தேன். எதிர்பார்த்தபடி என்னால் இதை செய்ய முடியவில்லை. ஃபிளாஷ் டிரைவிற்குள் வாசிப்பு பாதுகாப்பு பிட்கள் செயல்படுத்தப்பட்டதன் காரணமாக இருக்கலாம்.
பின்னர் நினைவகம்/பதிவுகளை எழுதுவதற்கும் வாசிப்பதற்கும் எனது சொந்த எளிய திசையன்கள் சிலவற்றை உருவாக்கினேன். ஃபிளாஷ் டிரைவ் பாதுகாக்கப்பட்டிருந்தாலும், முழு SROM ஐயும் நாம் படிக்க முடியும் என்பதை நினைவில் கொள்க!
5.4 ஆன்-சிப் பதிவேடுகளை அடையாளம் காணுதல்
"பிரிக்கப்பட்ட" வெக்டார்களைப் பார்த்த பிறகு, M0C ஆப்கோடுகளைக் குறிப்பிட, சாதனம் ஆவணமற்ற பதிவேடுகளை (8xF0-8xFA) பயன்படுத்துகிறது என்பதைக் கண்டுபிடித்தேன், அவை நேரடியாகச் செயல்படுத்தப்பட்டு, பாதுகாப்பைத் தவிர்த்து. இது "ADD", "MOV A, X", "PUSH" அல்லது "JMP" போன்ற பல்வேறு ஆப்கோடுகளை இயக்க என்னை அனுமதித்தது. அவர்களுக்கு நன்றி (அவர்கள் பதிவேட்டில் உள்ள பக்க விளைவுகளைப் பார்த்து) எந்த ஆவணமற்ற பதிவேடுகள் உண்மையில் வழக்கமான பதிவுகள் (A, X, SP மற்றும் PC) என்பதை என்னால் தீர்மானிக்க முடிந்தது.
இதன் விளைவாக, HSSP_disas.rb கருவியால் உருவாக்கப்பட்ட “பிரிக்கப்பட்ட” குறியீடு இதுபோல் தெரிகிறது (தெளிவுக்காக நான் கருத்துகளைச் சேர்த்துள்ளேன்):
இந்த கட்டத்தில் நான் ஏற்கனவே PSoC உடன் தொடர்பு கொள்ள முடியும், ஆனால் ஃபிளாஷ் டிரைவின் பாதுகாப்பு பிட்கள் பற்றிய நம்பகமான தகவல்கள் இன்னும் என்னிடம் இல்லை. பாதுகாப்பு செயல்படுத்தப்பட்டதா என்பதைச் சரிபார்க்க சைப்ரஸ் சாதனத்தின் பயனருக்கு எந்த வழியையும் வழங்கவில்லை என்பதில் நான் மிகவும் ஆச்சரியப்பட்டேன். டிர்க் தனது மாற்றத்தை வெளியிட்ட பிறகு, சைப்ரஸ் வழங்கிய HSSP குறியீடு புதுப்பிக்கப்பட்டது என்பதைப் புரிந்து கொள்ள, கூகுளில் ஆழமாகத் தோண்டினேன். அதனால்! இந்த புதிய திசையன் தோன்றியது:
இந்த வெக்டரைப் பயன்படுத்தி (psoc.py இல் read_security_data ஐப் பார்க்கவும்), SRAM இல் உள்ள அனைத்து பாதுகாப்பு பிட்களையும் 0x80 இல் பெறுகிறோம், அங்கு ஒரு பாதுகாக்கப்பட்ட தொகுதிக்கு இரண்டு பிட்கள் இருக்கும்.
இதன் விளைவாக மனச்சோர்வடைந்துள்ளது: எல்லாம் "வெளிப்புற வாசிப்பு மற்றும் எழுதுவதை முடக்கு" முறையில் பாதுகாக்கப்படுகிறது. எனவே, ஃபிளாஷ் டிரைவிலிருந்து எதையும் படிக்க முடியாது என்பது மட்டுமல்லாமல், எங்களால் எதையும் எழுத முடியாது (எடுத்துக்காட்டாக, அங்கு ஒரு ROM டம்ப்பரை நிறுவ). மேலும் பாதுகாப்பை முடக்க ஒரே வழி முழு சிப்பை முழுவதுமாக அழிக்க வேண்டும். 🙁
6. முதல் (தோல்வியுற்ற) தாக்குதல்: ROMX
இருப்பினும், பின்வரும் தந்திரத்தை நாம் முயற்சி செய்யலாம்: எங்களிடம் தன்னிச்சையான ஆப்கோட்களை இயக்கும் திறன் இருப்பதால், ஃபிளாஷ் நினைவகத்தைப் படிக்கப் பயன்படும் ROMX ஐ ஏன் இயக்கக்கூடாது? இந்த அணுகுமுறை வெற்றிக்கு நல்ல வாய்ப்பு உள்ளது. ஏனெனில் SROM இலிருந்து தரவைப் படிக்கும் ReadBlock செயல்பாடு (இது திசையன்களால் பயன்படுத்தப்படுகிறது) ISSP இலிருந்து அழைக்கப்பட்டதா என்பதைச் சரிபார்க்கிறது. இருப்பினும், ROMX ஆப்கோடில் அத்தகைய சரிபார்ப்பு இல்லாமல் இருக்கலாம். எனவே இங்கே பைதான் குறியீடு (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
துரதிருஷ்டவசமாக இந்த குறியீடு வேலை செய்யவில்லை. 🙁 அல்லது மாறாக இது வேலை செய்கிறது, ஆனால் வெளியீட்டில் (0x28 0x30 0x40) எங்கள் சொந்த ஆப்கோட்களைப் பெறுகிறோம்! சாதனத்தின் தொடர்புடைய செயல்பாடு வாசிப்பு பாதுகாப்பின் ஒரு உறுப்பு என்று நான் நினைக்கவில்லை. இது ஒரு பொறியியல் தந்திரம் போன்றது: வெளிப்புற ஆப்கோடுகளை இயக்கும் போது, ROM பஸ் தற்காலிக இடையகத்திற்கு திருப்பி விடப்படும்.
இது அடிப்படையில் SROM செயல்பாட்டை 0x07 என்று அழைக்கிறது, ஆவணத்தில் ( சாய்வு சுரங்கம்):
இந்த செயல்பாடு செக்சம் சரிபார்ப்பு. பூஜ்ஜியத்தில் இருந்து தொடங்கி, ஒரு ஃபிளாஷ் வங்கியில் பயனர் குறிப்பிட்ட தொகுதிகளின் எண்ணிக்கையின் 16-பிட் செக்சம் கணக்கிடுகிறது. செக்சம் கணக்கிடும் போது பயன்படுத்தப்படும் தொகுதிகளின் எண்ணிக்கையை அனுப்ப BLOCKID அளவுரு பயன்படுத்தப்படுகிறது. "1" இன் மதிப்பு பிளாக் பூஜ்ஜியத்திற்கான செக்ஸத்தை மட்டுமே கணக்கிடும்; அதேசமயம் "0" ஆனது ஃபிளாஷ் வங்கியின் அனைத்து 256 தொகுதிகளின் மொத்த செக்சம் கணக்கிடப்படும். 16-பிட் செக்சம் KEY1 மற்றும் KEY2 வழியாக திரும்பும். KEY1 அளவுரு செக்ஸமின் குறைந்த-வரிசை 8 பிட்களை சேமிக்கிறது, மேலும் KEY2 அளவுரு உயர்-வரிசை 8 பிட்களை சேமிக்கிறது. பல ஃபிளாஷ் வங்கிகளைக் கொண்ட சாதனங்களுக்கு, செக்சம் செயல்பாடு ஒவ்வொன்றிற்கும் தனித்தனியாக அழைக்கப்படுகிறது. இது வேலை செய்யும் வங்கி எண் FLS_PR1 பதிவேட்டால் அமைக்கப்படுகிறது (இலக்கு ஃபிளாஷ் வங்கியுடன் தொடர்புடைய பிட்டை அமைப்பதன் மூலம்).
இது ஒரு எளிய செக்சம் என்பதை நினைவில் கொள்ளவும்: பைட்டுகள் ஒன்றன் பின் ஒன்றாக சேர்க்கப்படுகின்றன; ஆடம்பரமான CRC விந்தைகள் இல்லை. கூடுதலாக, M8C கோர் மிகவும் சிறிய அளவிலான பதிவேடுகளைக் கொண்டுள்ளது என்பதை அறிந்து, செக்சம் கணக்கிடும்போது, இடைநிலை மதிப்புகள் அதே மாறிகளில் பதிவு செய்யப்படும் என்று கருதினேன், அது இறுதியில் வெளியீட்டிற்குச் செல்லும்: KEY1 (0xF8) / KEY2 ( 0xF9).
எனவே கோட்பாட்டில் எனது தாக்குதல் இதுபோல் தெரிகிறது:
நாங்கள் ISSP வழியாக இணைக்கிறோம்.
CHECKSUM-SETUP வெக்டரைப் பயன்படுத்தி செக்சம் கணக்கீட்டைத் தொடங்குகிறோம்.
ஒரு குறிப்பிட்ட நேரத்திற்குப் பிறகு செயலியை மறுதொடக்கம் செய்கிறோம் T.
தற்போதைய செக்சம் C ஐப் பெற RAM ஐப் படிக்கிறோம்.
3 மற்றும் 4 படிகளை மீண்டும் செய்யவும், ஒவ்வொரு முறையும் T ஐ சிறிது அதிகரிக்கவும்.
ஃபிளாஷ் டிரைவிலிருந்து முந்தைய செக்சம் C ஐ தற்போதைய ஒன்றிலிருந்து கழிப்பதன் மூலம் தரவை மீட்டெடுக்கிறோம்.
இருப்பினும், ஒரு சிக்கல் உள்ளது: மறுதொடக்கம் செய்த பிறகு நாம் அனுப்ப வேண்டிய Initialize-1 திசையன் KEY1 மற்றும் KEY2 ஐ மேலெழுதுகிறது:
இந்த குறியீடு Calibrate1 (SROM செயல்பாடு 9) ஐ அழைப்பதன் மூலம் எங்கள் விலைமதிப்பற்ற செக்ஸத்தை மேலெழுதுகிறது... ஒருவேளை நாம் மேஜிக் எண்ணை (மேலே உள்ள குறியீட்டின் தொடக்கத்திலிருந்து) நிரலாக்க பயன்முறையில் நுழைய அனுப்பலாம், பின்னர் SRAM ஐப் படிக்கலாமா? ஆம், அது வேலை செய்கிறது! இந்த தாக்குதலை செயல்படுத்தும் Arduino குறியீடு மிகவும் எளிமையானது:
ஒரு குறிப்பிட்ட காலத்திற்கு காத்திருங்கள்; பின்வரும் குறைபாடுகளை கணக்கில் எடுத்துக்கொள்வது:
அது என்ன ஆனது என்று கண்டுபிடிக்கும் வரை நான் நிறைய நேரத்தை வீணடித்தேன் தாமதம் மைக்ரோ விநாடிகள் 16383 μsக்கு மிகாமல் தாமதத்துடன் மட்டுமே சரியாக வேலை செய்கிறது;
மைக்ரோசெகண்ட்ஸ், 0 ஐ உள்ளீடாக அனுப்பினால், அது முற்றிலும் தவறாக வேலை செய்யும் என்பதை நான் கண்டுபிடிக்கும் வரை அதே நேரத்தை மீண்டும் கொன்றேன்!
PSoC ஐ நிரலாக்க பயன்முறையில் மறுதொடக்கம் செய்யுங்கள் (தொடக்க திசையன்களை அனுப்பாமல், மேஜிக் எண்ணை அனுப்புவோம்).
பைத்தானில் இறுதிக் குறியீடு:
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))
சுருக்கமாக, இந்த குறியீடு என்ன செய்கிறது:
PSoC ஐ மீண்டும் துவக்குகிறது (மேலும் அதற்கு ஒரு மேஜிக் எண்ணை அனுப்புகிறது).
முழு துவக்க திசையன்களை அனுப்புகிறது.
Arduino செயல்பாட்டை Cmnd_STK_START_CSUM (0x85) அழைக்கிறது, அங்கு மைக்ரோ விநாடிகளில் தாமதமானது அளவுருவாக அனுப்பப்படும்.
செக்சம் (0xF8 மற்றும் 0xF9) மற்றும் ஆவணமற்ற பதிவேடு 0xF1 ஆகியவற்றைப் படிக்கிறது.
இந்த குறியீடு 10 மைக்ரோ வினாடியில் 1 முறை செயல்படுத்தப்படுகிறது. 0xF1 இங்கே சேர்க்கப்பட்டுள்ளது, ஏனெனில் இது செக்சம் கணக்கிடும் போது மாற்றப்பட்ட ஒரே பதிவு. ஒருவேளை இது எண்கணித லாஜிக் யூனிட்டால் பயன்படுத்தப்படும் ஒருவித தற்காலிக மாறியாக இருக்கலாம். Arduino வாழ்க்கையின் அறிகுறிகளைக் காட்டுவதை நிறுத்தும்போது, picocom ஐப் பயன்படுத்தி Arduino ஐ மீட்டமைக்க நான் பயன்படுத்தும் அசிங்கமான ஹேக்கைக் கவனியுங்கள் (ஏன் என்று தெரியவில்லை).
7.2 முடிவைப் படித்தல்
பைதான் ஸ்கிரிப்ட்டின் முடிவு இதுபோல் தெரிகிறது (படிப்பதற்கு எளிமைப்படுத்தப்பட்டது):
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
சொல்லப்பட்டால், எங்களுக்கு ஒரு சிக்கல் உள்ளது: நாங்கள் உண்மையான செக்சம் மூலம் செயல்படுவதால், ஒரு பூஜ்ய பைட் மதிப்பை மாற்றாது. இருப்பினும், முழு கணக்கீட்டு செயல்முறையும் (8192 பைட்டுகள்) 0,1478 வினாடிகள் (ஒவ்வொரு முறையும் இயங்கும் போது சிறிய மாறுபாடுகளுடன்), இது ஒரு பைட்டுக்கு தோராயமாக 18,04 μs ஆக இருக்கும் என்பதால், சரியான நேரத்தில் செக்சம் மதிப்பைச் சரிபார்க்க இந்த நேரத்தைப் பயன்படுத்தலாம். கணக்கீட்டு செயல்முறையின் காலம் எப்போதும் கிட்டத்தட்ட ஒரே மாதிரியாக இருப்பதால், முதல் ஓட்டங்களுக்கு, எல்லாம் மிகவும் எளிதாகப் படிக்கப்படுகிறது. இருப்பினும், இந்த டம்ப்பின் முடிவு குறைவான துல்லியமாக உள்ளது, ஏனெனில் ஒவ்வொரு ஓட்டத்திலும் "சிறிய நேர விலகல்கள்" குறிப்பிடத்தக்கதாக மாறும்:
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
ஒவ்வொரு மைக்ரோ செகண்ட் தாமதத்திற்கும் 10 டம்ப்கள். ஃபிளாஷ் டிரைவின் அனைத்து 8192 பைட்டுகளையும் வெளியேற்றுவதற்கான மொத்த இயக்க நேரம் சுமார் 48 மணிநேரம் ஆகும்.
7.3 ஃபிளாஷ் பைனரி புனரமைப்பு
எல்லா நேர விலகல்களையும் கணக்கில் எடுத்துக்கொண்டு, ஃபிளாஷ் டிரைவின் நிரல் குறியீட்டை முழுமையாக மறுகட்டமைக்கும் குறியீட்டை நான் இன்னும் எழுதவில்லை. இருப்பினும், இந்த குறியீட்டின் தொடக்கத்தை நான் ஏற்கனவே மீட்டெடுத்துள்ளேன். நான் அதைச் சரியாகச் செய்தேன் என்பதை உறுதிப்படுத்த, 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
மிகவும் நம்பத்தகுந்ததாக தெரிகிறது!
7.4 பின் குறியீடு சேமிப்பக முகவரியைக் கண்டறிதல்
இப்போது நமக்குத் தேவையான நேரத்தில் செக்சமைப் படிக்க முடியும் என்பதால், அது எப்படி, எங்கு மாறுகிறது என்பதை எளிதாகச் சரிபார்க்கலாம்:
தவறான PIN குறியீட்டை உள்ளிடவும்;
பின் குறியீட்டை மாற்றவும்.
முதலில், தோராயமான சேமிப்பக முகவரியைக் கண்டறிய, மறுதொடக்கத்திற்குப் பிறகு 10 எம்எஸ் அதிகரிப்பில் செக்சம் டம்ப் எடுத்தேன். பின்னர் நான் தவறான பின்னை உள்ளிட்டு அதையே செய்தேன்.
பல மாற்றங்கள் இருந்ததால், விளைவு மிகவும் இனிமையானதாக இல்லை. ஆனால் இறுதியில் செக்சம் 120000 µs மற்றும் 140000 µs தாமதத்திற்கு இடையில் மாறிவிட்டது என்பதை என்னால் தீர்மானிக்க முடிந்தது. ஆனால் நான் அங்கு காட்டிய "பின்கோடு" முற்றிலும் தவறானது - தாமதமான மைக்ரோசெகண்ட்ஸ் செயல்முறையின் ஒரு கலைப்பொருளின் காரணமாக, 0 அதற்கு அனுப்பப்படும்போது விசித்திரமான செயல்களைச் செய்கிறது.
பின்னர், கிட்டத்தட்ட 3 மணிநேரம் செலவழித்த பிறகு, SROM அமைப்பு அழைப்பு செக்சம் செக்சம்க்கான தொகுதிகளின் எண்ணிக்கையைக் குறிப்பிடும் உள்ளீடாக ஒரு வாதத்தைப் பெறுகிறது என்பதை நினைவில் கொண்டேன்! அந்த. PIN குறியீட்டின் சேமிப்பக முகவரியையும், "தவறான முயற்சிகள்" கவுண்டரையும் 64-பைட் பிளாக் துல்லியத்துடன் எளிதாக உள்ளூர்மயமாக்கலாம்.
எனது ஆரம்ப ஓட்டங்கள் பின்வரும் முடிவை உருவாக்கியது:
பின் குறியீட்டை "123456" இலிருந்து "1234567" ஆக மாற்றினேன்:
எனவே, பின் குறியீடு மற்றும் தவறான முயற்சிகளின் கவுண்டர் ஆகியவை பிளாக் எண். 126 இல் சேமிக்கப்பட்டதாகத் தெரிகிறது.
7.5 தொகுதி எண். 126-ன் குப்பையை எடுத்துக்கொள்வது
பிளாக் #126 என்பது செக்சம் கணக்கீட்டின் தொடக்கத்திலிருந்து 125x64x18 = 144000μs என் முழு டம்ப்பில் எங்காவது அமைந்திருக்க வேண்டும், மேலும் இது மிகவும் நம்பத்தகுந்ததாகத் தெரிகிறது. பின்னர், பல தவறான டம்ப்களை கைமுறையாகப் பிரித்த பிறகு ("சிறிய நேர விலகல்களின்" திரட்சியின் காரணமாக), நான் இந்த பைட்டுகளைப் பெற முடிந்தது (145527 μs தாமதத்தில்):
PIN குறியீடு மறைகுறியாக்கப்படாத வடிவத்தில் சேமிக்கப்பட்டுள்ளது என்பது மிகவும் வெளிப்படையானது! இந்த மதிப்புகள், நிச்சயமாக, ASCII குறியீடுகளில் எழுதப்படவில்லை, ஆனால் அது மாறும் போது, அவை கொள்ளளவு விசைப்பலகையிலிருந்து எடுக்கப்பட்ட அளவீடுகளை பிரதிபலிக்கின்றன.
இறுதியாக, மோசமான முயற்சி கவுண்டர் எங்கே சேமிக்கப்பட்டது என்பதைக் கண்டறிய இன்னும் சில சோதனைகளை நடத்தினேன். இதோ முடிவு:
0xFF - அதாவது "15 முயற்சிகள்" மற்றும் ஒவ்வொரு தோல்வியுற்ற முயற்சியிலும் இது குறைகிறது.
7.6 பின் குறியீடு மீட்பு
மேலே உள்ளவற்றை ஒன்றாக இணைக்கும் எனது அசிங்கமான குறியீடு இதோ:
நான் பயன்படுத்திய லேட்டன்சி மதிப்புகள் ஒரு குறிப்பிட்ட PSoC-க்கு தொடர்புடையதாக இருக்கலாம் - நான் பயன்படுத்திய ஒன்று.
8. அடுத்து என்ன?
எனவே, எங்கள் Aigo இயக்கத்தின் சூழலில், PSoC பக்கத்தில் சுருக்கமாகக் கூறுவோம்:
SRAM பாதுகாக்கப்பட்டிருந்தாலும் அதைப் படிக்கலாம்;
குளிர்ந்த பூட் ட்ரேஸ் தாக்குதலைப் பயன்படுத்தி, PIN குறியீட்டை நேரடியாகப் படிப்பதன் மூலம் ஸ்வைப் எதிர்ப்பு பாதுகாப்பைத் தவிர்க்கலாம்.
இருப்பினும், ஒத்திசைவு சிக்கல்கள் காரணமாக எங்கள் தாக்குதலில் சில குறைபாடுகள் உள்ளன. இது பின்வருமாறு மேம்படுத்தப்படலாம்:
"கோல்ட் பூட் ட்ரேஸ்" தாக்குதலின் விளைவாக பெறப்பட்ட வெளியீட்டு தரவை சரியாக டிகோட் செய்ய ஒரு பயன்பாட்டை எழுதவும்;
மிகவும் துல்லியமான நேர தாமதங்களை உருவாக்க FPGA கேஜெட்டைப் பயன்படுத்தவும் (அல்லது Arduino வன்பொருள் டைமர்களைப் பயன்படுத்தவும்);
மற்றொரு தாக்குதலை முயற்சிக்கவும்: வேண்டுமென்றே தவறான PIN குறியீட்டை உள்ளிடவும், மறுதொடக்கம் செய்து RAM ஐ டம்ப் செய்யவும், ஒப்பிடுவதற்கு சரியான PIN குறியீடு RAM இல் சேமிக்கப்படும் என்று நம்புகிறோம். இருப்பினும், Arduino இல் இதைச் செய்வது அவ்வளவு எளிதானது அல்ல, ஏனெனில் Arduino சமிக்ஞை நிலை 5 வோல்ட் ஆகும், அதே நேரத்தில் நாங்கள் ஆய்வு செய்யும் பலகை 3,3 வோல்ட் சிக்னல்களுடன் செயல்படுகிறது.
படிக்கக்கூடிய பாதுகாப்பைத் தவிர்ப்பதற்கு மின்னழுத்த மட்டத்துடன் விளையாடுவது முயற்சி செய்யக்கூடிய ஒரு சுவாரஸ்யமான விஷயம். இந்த அணுகுமுறை செயல்பட்டால், துல்லியமற்ற நேர தாமதங்களுடன் செக்சம் வாசிப்பதை நம்புவதற்குப் பதிலாக - ஃபிளாஷ் டிரைவிலிருந்து முற்றிலும் துல்லியமான தரவைப் பெற முடியும்.
ரீட் பிளாக் சிஸ்டம் கால் வழியாக SROM கார்டு பிட்களைப் படிப்பதால், நாமும் அதையே செய்யலாம் விவரித்தார் டிமிட்ரி நெடோஸ்பாசோவின் வலைப்பதிவில் - கிறிஸ் ஜெர்லின்ஸ்கியின் தாக்குதலின் மறு-அமுலாக்கம், மாநாட்டில் அறிவிக்கப்பட்டது "ரீகான் பிரஸ்ஸல்ஸ் 2017".
செய்யக்கூடிய மற்றொரு வேடிக்கையான விஷயம் என்னவென்றால், சிப்பில் இருந்து கேஸை அரைப்பது: ஒரு SRAM டம்ப் எடுக்க, ஆவணமற்ற கணினி அழைப்புகள் மற்றும் பாதிப்புகளைக் கண்டறிதல்.
9. முடிவுக்கு
எனவே, இந்த இயக்ககத்தின் பாதுகாப்பு விரும்பத்தக்கதாக உள்ளது, ஏனெனில் இது PIN குறியீட்டைச் சேமிக்க வழக்கமான ("கடினப்படுத்தப்படாத") மைக்ரோகண்ட்ரோலரைப் பயன்படுத்துகிறது... மேலும், தரவு எவ்வாறு நடக்கிறது என்பதை நான் (இன்னும்) பார்க்கவில்லை. இந்தச் சாதனத்தில் குறியாக்கம்!
ஐகோவிற்கு நீங்கள் என்ன பரிந்துரைக்கலாம்? மறைகுறியாக்கப்பட்ட HDD டிரைவ்களின் இரண்டு மாதிரிகளை பகுப்பாய்வு செய்த பிறகு, 2015 இல் நான் செய்தேன் வழங்கல் SyScan இல், பல வெளிப்புற HDD டிரைவ்களின் பாதுகாப்புச் சிக்கல்களை ஆய்வு செய்தார், மேலும் அவற்றில் எதை மேம்படுத்தலாம் என்பது குறித்த பரிந்துரைகளை வழங்கினார். 🙂
இரண்டு வார இறுதி நாட்களிலும் பல மாலை நேரங்களிலும் இந்த ஆராய்ச்சியில் ஈடுபட்டேன். மொத்தம் சுமார் 40 மணி நேரம். ஆரம்பம் முதல் (நான் வட்டைத் திறந்தபோது) இறுதி வரை எண்ணுதல் (PIN குறியீடு டம்ப்). அதே 40 மணி நேரத்தில் நான் இந்த கட்டுரையை எழுத செலவழித்த நேரமும் அடங்கும். இது மிகவும் உற்சாகமான பயணம்.