Աննա Անտոնենկոն, ով մշակում է ներկառուցված համակարգեր և իր ազատ ժամանակ զարգացնում է BOSS (BEAM-ի վրա հիմնված Օպերացիոն համակարգ անվտանգության ապահովմամբ) օպերացիոն համակարգը, հրապարակել է Yamaha PSR-E433 երաժշտական սինթեզատորի հակադարձ ինժեներիայի արդյունքները։ Կատարված աշխատանքի ընթացքում սինթեզատորում հայտնաբերվել է խճճված ինտերֆեյս, որը հնարավորություն է տվել կազմակերպել դրա կոդի կատարումը որոնվածի մակարդակով: Shell ինտերֆեյսը հասանելի է SysEx հաղորդագրություններ պարունակող MIDI փաթեթներ ուղարկելու միջոցով, որոնք կարող են փոխանցվել, երբ սինթեզատորը միացված է USB-ի միջոցով: Հակադարձ ճարտարագիտության ընթացքում ստացված չիպի և որոնվածի մասին տեղեկությունները, ինչպես նաև կոդերի օրինակները և վրիպազերծման աղբարկղերը տեղադրվում են GitHub-ում:
Հակադարձ ճարտարագիտության նկատմամբ հետաքրքրությունը ծագեց մի քանի տարի առաջ, այն բանից հետո, երբ Աննան որոշեց մաքրել սինթեզատորի ներսը փոշուց և միևնույն ժամանակ բավարարել իր հետաքրքրասիրությունը՝ կապված սարքի ներսը տեսնելու ցանկության հետ: Տախտակը պարունակում էր YAMAHA SWL01U չիպ, որի մասին մանրամասն տեղեկություններ չկարողացան գտնել համացանցում։ Մի քանի ամիս առաջ Աննան հանդիպեց նմանատիպ սինթեզատորի մոդելի ձեռնարկին, որը պարունակում էր այս չիպի պինաուտը: Աննան կրկին ապամոնտաժեց սարքը և սկսեց փորձերը՝ օգտագործելով տախտակի վրա առկա կապերը JTAG կարգաբերման ինտերֆեյսի և UART պորտի համար:

Օգտագործելով OpenOCD կարգաբերիչը, միանալով JTAG-ին և փորձերին, պարզվեց, որ տախտակն օգտագործում է ARM7TDMI պրոցեսորային միջուկով չիպ: Ուսումնասիրելով հիշողության դասավորությունը կարգաբերիչում, մենք կարողացանք բեռնաթափել ROM-ում և Flash հիշողության մեջ տեղակայված որոնվածի բովանդակությունը: Ապամոնտաժային ծրագրերի պատկերները վերլուծվել են Ghidra հակադարձ ինժեներական փաթեթի միջոցով:
Որոնվածից արդյունահանված լարային տվյալները դիտելիս նշվեց մի շարք տողեր («օգնություն», «info», «ver», «logout» և այլն), որոնք նման են shell հրամաններին: Այս տողերի ցուցիչները ուսումնասիրելով՝ բացահայտվեց կոդ, որը կոչում էր գործառույթներ՝ հրամաններ մշակելու համար՝ հիշեցնելով մուտքի ինտերֆեյս և հրամանի վահանակ: Պարզվել է նաև, որ shell-ն ակտիվացնելու համար տրամադրվում է «login» հրամանը, որին անհրաժեշտ է փոխանցել «#0000» գաղտնաբառը։ void shell_run_command(char* command_input) {if (shell_login_state == 0) {if (shell_compare_command(command_input, «login») == 0) {shell_ask_passwd(); // տպում է «passwd? « shell_login_state = 1; } } else if (shell_login_state == 1) {if (shell_compare_command(command_input, "#0000") == 0) {shell_login_ok(); // տպում է «login OK» shell_login_state = 2; } else { shell_print("Passwd Error\r"); shell_login_state = 0; } } else { // իրականում գործարկեք հրամանը } }
Որոնվածի հետագա ուսումնասիրությունը ցույց է տվել, որ հրամանները մշակվում են խմբաքանակով՝ միշտ սկսած նույն 8 բայթ տվյալներից և վերջացրած 0xf7 կոդով: Քանի որ արտաքին փոխազդեցությունը սինթեզատորի հետ իրականացվում է միայն MIDI-ի միջոցով, և MIDI-ի հստակեցումը ապահովում է SysEx հաղորդագրությունների հատուկ ծառայության տեսակ, ենթադրվում էր, որ դա կարող է օգտագործվել հրամաններ փոխանցելու համար: Հետագա ենթադրությունն այն էր, որ SysEx-ի հաղորդագրություններն ու փաթեթները, որոնք վերլուծվում էին shell-ի կողմից, սկսվում էին մեկ կոդով՝ 0xf0, որին հաջորդում էր արտադրողի ID 0x43 (Yamaha):
Հիպոթեզը ստուգելու համար գրվել է Python սկրիպտ, որը մուտքագրված տվյալները թարգմանում է MIDI պրոտոկոլային փաթեթների։ Եվ մեթոդն աշխատեց՝ login passwd? #0000 մուտք Լա՞վ > օգնե՞լ դուրս գալու օգնություն: info ver stack perf-on perf-off perf-disp d dp d xxxxx d/s xxxxx m ՀԱՍՑԵ ՏՎՅԱԼՆԵՐԻ m/b ՀԱՍՑԵ ՏՎՅԱԼՆԵՐԻ m/w ՀԱՍՑԵ ՏՎՅԱԼՆԵՐԻ m/l ՀԱՍՑԵ ՏՎՅԱԼՆԵՐԸ > info DevelopName PSR-E433N Deve 3341 Դարձնել տվյալներ և ժամը ՄԱՅԻՍԻ 3341 16 2012:19:00 J/E Ընտրեք անգլերեն >
«Օգնություն» հրամանն ուղարկելիս ցուցադրվող հուշումը, ի թիվս այլ բաների, ներառում էր հիշողության բովանդակությունը փոխելու հրամաններ: Օգտագործելով այս հրամանները՝ հնարավոր եղավ բեռնել կամայական ծածկագիրը հիշողության մեջ և փոխանցել հսկողությունը դրան՝ փոխարինելով ցուցիչը փաթեթի վրա, որն օգտագործվում էր հրամանների մշակման ավարտից հետո վերադառնալու համար: Որպես փորձ, անսամբլի լեզվով գրված մի պարզ հավելված տեղադրվեց չօգտագործված հիշողության տարածքում, որը դուրս է բերում «HeloWrld» տողը 8 նիշանոց LCD էկրանի ցուցիչի վրա: Ծրագիրը ֆորմատավորվել է որպես սովորական MIDI ֆայլ, որը պարզապես անհրաժեշտ էր փոխանցել սարքին։

Դրանից հետո սկսվեց աշխատանքը LCD էկրանի վրա գրաֆիկական ելքի առանձնահատկությունների ուսումնասիրության վրա, որն ավարտվեց կոդի պատրաստմամբ, որը կամայական պիքսելային բովանդակություն դուրս կբերի նիշերի տարածքում՝ համաժամանակ արտաքին սարքում Bad Apple-ի տեսանյութի նվագարկման հետ (տեսանյութ՝ ցուցադրմամբ )


Source: opennet.ru
