Remoticon 2021: Uri Swaked inverse l’ESP32 WiFi
Vous savez comment vous travaillez sur un projet, d’autres quêtes latérales apparaissent à gauche et à droite? Vous pouvez choisir de les gérer brièvement et sommairement, ou vous pouvez y plonger en tant que projets à part entière. Eh bien, URI SHAKED est l’auteur de WOKWI, un simulateur en ligne Arduino qui vous permet de tester notre code sur le matériel émulé. (C’est très, très cool.) De retour dans la journée, Arduino a indiqué AVR, et il a mis en place des efforts impressionnants sur l’ingénierie inverse qui puce d’acheter pour l’imiter avec succès. Mais alors “Arduino” indique tellement beaucoup plus que d’AVR ces jours-ci, alors l’Uri a dû s’attaquer aux chips du bras STM32 et même le récent RP2040.
Arduino s’exécute également sur l’ESP32, alors Uri a également mis son chapeau d’ingénierie inverse (littéralement) et a également pris son objectif à cette puce. Mais l’ESP32 est une tonne beaucoup plus compliquée que l’un de ces autres microcontrôleurs, non seulement sur la puce légèrement Niche Xtensa, mais également la connexion Wi-Fi à bord et son micrologiciel binaire associé. Ingénierie inverse Le WiFi de l’ESP32 est la quête latérale que Uri embarque, des écrases absolument écrases et des papiers pour nous dans cette conversation Remoticon 2021 Talk.
Furtivement et piquant
L’ESP32 traite le WiFi comme périphérique mappé de mémoire, comme si vous êtes probablement habitué à des microcontrôleurs. Pour les goupilles GPIO, par exemple, la mappage de mémoire indique que vous pouvez écrire un 1 ou 0 dans un peu de mémoire particulière, et il allumera ou désactiver une LED externe. Lisez à partir de cet emplacement de mémoire et vous pouvez dire si quelqu’un pousse un bouton. Pour WiFi, c’est généralement la même chose, mais elle est principalement complètement non documentée où les adresses de mémoire sont et ce qu’elles sont pour. La technique d’Uri utilise un débogueur à la JTAG sur le matériel physique, un plugin ghidra pour l’aider à travailler sur les fichiers binaires et à son propre simulateur ESP32 pour faire face à tout cela.
Tout d’abord, il a clignoté l’un des programmes de base de l’ESP-IDF WiFi «Hello World» dans son simulateur, passa de la verbosité de l’exploitation forestière jusqu’à onze et l’a couru jusqu’à ce qu’il se soit écrasé. Ce qu’il a fait rapidement, parce que son simulateur n’avait pas encore aucune du matériel WiFi. Avec GDB, le débogueur, il pourrait comprendre quelle fonction en particulier s’est écrasée. Puis il a pris cette fonction à part.
Tout droit de la chauve-souris, il a eu de la chance. Une fonction, utilement appelée hal_mac_deinit () n’a pas semblé faire beaucoup, sauf écrire des valeurs particulières à une adresse mémoire fixe et attendez une réponse particulière. Il a ensuite programmé son simulateur pour donner cette réponse, qui a fait tomber le programme un peu en aval. Succès! Qu’est-ce que l’adresse de la mémoire dans la carte des questions? La fiche technique dit “réservée” mais cela n’a pas pris trop grandes personnes de foi pour supposer que c’est une sorte de registre de contrôle wifi.
Le reste de la conversation a URI décrivant ce ping-pingage répété entre un programme écrasé sur son simulateur, en utilisant Ghidra et GDB pour déterminer ce que le code écrasé fait, puis pour intégrer le comportement souhaité dans son simulateur jusqu’à ce que ce bit de code ait fonctionné . Ce qui est vraiment incroyable, c’est que cela finit par une simulation de la manière dont le WiFi de l’ESP32 travaille à l’intérieur, c’est tellement bon qu’il puisse exécuter des bibliothèques Python MQTT sur le périphérique simulé, et cela fonctionne exactement comme s’il fonctionnait sur le matériel natif. Étonnante!
C’est une excellente conversation, fournissant une introduction de haut niveau d’ingénierie inverse à l’aide d’une émulation comme outil crucial. C’est une excellente technique et nous sommes ravis d’avoir pu examiner les épaules métaphoriques d’Uri. Vérifiez-le!