首页 » 神马SEO » 黑帽seo随机ascii_ArduinoAvr libc制作Badusb事理讲解

黑帽seo随机ascii_ArduinoAvr libc制作Badusb事理讲解

访客 2024-10-27 0

扫一扫用手机浏览

文章目录 [+]

2014年美国黑帽大会上研讨职员JakobLell和Karsten Nohl展现了badusb的攻击办法后,海内与badusb相关的文章固然有了一些,但是大部门人把相关文章都阅读后还是会有种“不明觉厉”的感到,badusb仍有一层朦胧的面纱。
颠末一段光阴的学习和研讨后,笔者愿望通过自己的一些心得体会可以或许资助别的人更清楚地认识badusb,也愿望这篇文章可以或许起到必定的启迪。
这篇文章主要分为五个部门——知识扫盲部门、badusb固件编写部门、badusb装备界面部门、技巧展望部门和总结部门。

二、硬件预备

黑帽seo随机ascii_ArduinoAvr libc制作Badusb事理讲解 黑帽seo随机ascii_ArduinoAvr libc制作Badusb事理讲解 神马SEO

本文运用的硬件是Arduino Leonardo开辟板,但是不难将Leonardo开辟板调换为别的Arduino开辟板。

黑帽seo随机ascii_ArduinoAvr libc制作Badusb事理讲解 黑帽seo随机ascii_ArduinoAvr libc制作Badusb事理讲解 神马SEO
(图片来自网络侵删)

三、知识扫盲

1. 固然USB协定有必定的马脚,但是不是任何USB装备都能制造badusb的。
制造badusb有两个焦点,一个是可以或许为USB装备编写相应的固件,另一个是可以或许将编写的固件烧录到USB装备中。
要编写相应的固件就须要掌握USB装备中微节制器(或许说芯片)的指令标准文档(如果Intel不供给开辟文档,那末除Intel自己没有人能为Intel处理器编写法度模范);而要将固件烧录到USB装备中,要末运用相应的硬件编程器,要末就须要USB装备自己曾经存在的bootloader来帮助停滞烧录事情(bootloader是USB装备厂商在临蓐时就放在USB装备中的,网上某些优盘的优盘量产工具也是从厂商流出的,而不是第三方编写的)。
要同时满意两个焦点条件还是比较难的,即便是JakobLell和Karsten Nohl颁布的badusb运用代码也是针对满意必定条件的优盘,由于流出的优盘量产工具无限(既然有优盘量产工具,可以或许推测相应的优盘中确定有bootloader或许相似bootloader的固件存在,那末通过逆向优盘量产工具就可以够或许掌握PC端软件和特定优盘的通讯方法,进而实现自己的烧录工具)。

2. Arduino 和 teensy这类开辟板之以是轻易制造badusb,是由于它们采取的微节制器民间有详细的阐明文档。
最常用的是atmel公司的微节制器,atmel官网供给了各种开辟文档和开辟相关的库等。

3. Atmel厂商的微节制器整合了SRAM, FLASH和EEPROM。
SRAM就比如电脑的内存,不消关怀;FLASH高地点寄存的是bootloader,低地点则寄存用户烧录的固件,芯片加电韶光接履行用户的固件,但是芯片复位时会先履行bootloader(这一点是烧录的症结),再履行用户的固件;EEPROM则主要用来寄存数据,用户可以或许随便改动EEPROM中的数据,固件也能够或许从EEPROM里读取数据(本文的固件示例和PC端法度模范都运用了这一特色)。

4. Avr libc是一个开源名目,针对atmel厂商的各种微节制器开辟C说话库、编译器、烧录工具等一系列帮助工具,另有针对Windows平台的WinAvr名目。
Arduino ide的焦点实在也是avr libc。

5. Arduino的开辟板有相应的bootloader(在FLASH高地点)可以或许和avr libc名目中的avrdude.exe软件通讯,实现固件的烧写和读取举措。
在Arduino开辟板复位时,会加载bootloader,这时就可以够或许运用avrdude.exe和bootloader通讯。
复位操纵可以或许通过开辟板上的复位按钮,或许编程实现软复位操纵(如果开辟板支撑的话)。

6. Intel hex 是一种用于编程器的特殊的文件格局,正是由于这类格局,使得咱们可以或许清闲节制数据的存储地点。
Intel hex的文件格局阐发可以或许自行网上搜刮。

四、知识得到道路

1. USB知识得到

如果只是为了简单懂得USB装备为何可以或许模拟键盘、鼠标等别的装备,网上有很多博客是对付USB标准详解的,也能够或许简单地看《USB开辟大全》和《USB运用开辟实例详解》前面对于USB通用协定部门,如果不是对硬件感兴趣没须要穷究。

2. Arduino、Avr libc知识得到

这两样实在都是开源的,以是只要有充足的精神和气力,看源代码深刻懂得相关知识是没成绩的。
但是如果只是想体验一下制造badusb,可以或许只看一下Arduino的民间文档和avrdude.exe的相关文档,看这些文档时也没须要穷究每一个细节,能必定程度上“照葫芦画瓢”就可以够或许了。

五、Badusb固件编写

这里给的固件示例在履行时会从EEPROM中指定的地点读取数据,依据读取的数据和制订的规矩发送相应的按键相应给PC主机。

#include\"大众Keyboard.h\"大众#include\公众EEPROM.h\公众 intmodifier_key = -1; //modifier_key不为-1阐明Win键、Ctrl键或许Shift键按下,这个示例特指Win键intkeycode; //寄存要发送的按键代码unsignedint delay_time = 0; //固件履行下条指令时提早的光阴unsignedint address = 0; //从EEPROM读取数据的地点,这里要和EEPROM寄存数据的地点同等charnum_char[10] = {0}; //某个数字的字符串情势,这个数字用于delay()的参数,也便是作为就寝的光阴int num= 0;intindex = 0; //change this to match your platform:voidsetup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); Keyboard.begin(); delay(1000); //期待一段光阴,让USB装备和PC主机通讯实现初始化事情 while((keycode = EEPROM.read(address++))!= 0){//循环从EEPROM中读取数据直到读到数值0(不是数字0),这个值是在向EEPROM中写入数据时在末端增加的。
if (keycode == '$') { //如果从EEPROM中读到的数值即是'$'的ASCII码 modifier_key = 131; //将modifier_key的值设为Win键的键值,这个值会和后续的按键组合后发送给PC主机 continue; }/ 将两个'&'字符之间的数字作为后续一个按键发送后就寝的光阴,这里之以是要有这个节制值是由于各种身分都会影响按键按下到某个窗口弹出的光阴,如果在窗口未弹出就发送了某个按键,这个按键就生效了,后续的按键组合起来也不完备了。
比如在按下Win+R键后,还没等运转对话框弹出,固件就发送了\"大众cmd\"大众按键,那末这次启动cmd确定就失落败了。
/ if (keycode == '&') { while ((keycode = EEPROM.read(address++))!= '&') { num_char[index++] = keycode; } sscanf(num_char, \公众%d\"大众,&num); delay_time = num; //将EEPROM中读取的数据转换为数值后保留到delay_time,节制下次发送按键后就寝光阴 memset(num_char, 0, sizeof(num_char));//清空num_char为下次转换做预备 continue; } if (keycode == ';') { //如果从EEPROM中读取的数值即是';'的ASCII码,将发送一个回车键的按键码 keycode = 176; //176即是回车键的按键码 } Write(keycode); //现实发送按键的举措 };}//voidloop() { // do nothing: while (true);} voidWrite(int code){ if (modifier_key != -1) { //在这个例子中,modifier_key不即是-1就即是Win键的按键码 Keyboard.press(modifier_key); //按下Win键,不放 Keyboard.press(code); //按下另一个按键,不放 Keyboard.releaseAll(); //同时放开Win键和另一个按键,发送Win+某个按键给PC主机 modifier_key = -1; delay(delay_time); //这个光阴要末即是0,要末即是两个'&'字符之间指定的值 } else { Keyboard.write(code); //不然间接按下某个按键并放开 delay(delay_time); //这个光阴要末即是0,要末即是两个'&'字符之间指定的值 } delay_time = 0;}

这里针对这个固件给几个例子资助懂得:

1. 从EEPROM中顺次读取到’$'、’r'($r)表现badusb会按下Win+R键。

2. 从EEPROM中顺次读取到’$'、’r'、’;'($r;)表现badusb会按下Win+R,而后按回车键。

3. 从EEPROM中顺次读取到’&’、’5′、’0′、’0′、’&’、’$'、’r'、’;'(&500&$r;)表现badusb会按下Win+R键,而后期待500毫秒(包管运转对话框弹出),再按下回车键。

4. 从EEPROM中顺次读取到(&500&$rpowershell&400&;Get-Date;)表现badusb先按下Win+R键,期待500毫秒后输入powershell,按回车键后期待400毫秒,再输入Get-Date,末了按下回车键。

六、Badusb装备界面

所谓的Badusb装备界面,便是avrdude.exe的UI界面精简版,再额定供给了节制Badusb履行的举措的功效(本色便是改动了EEPROM特定地点的数据,由于固件是依据EEPROM中的数据履行举措的)。

图1 PC法度模范界面

这个法度模范主要便是avrdude.exe的UI界面,只要executable处和address处是为了自定义Badusb举措操持的。
partno的选项和programmer的选项是阐发选定的avrdude.conf得到的,以是未定定avrdude.conf的话partno和programmer的下拉框将为空;端标语是通过注册表获得到的。

当点击upload按钮或许dump按钮时,先运用编程方法实现复位操纵(前面会解释若何实现的),在长久的停息后运用CreateProcess履行avrdude.exe法度模范;而如果用户在executable处输入了字符串,PC法度模范会依据用户输入的字符串和Address处给定的地点天生intel hex格局的文件(还记得前面知识扫盲部门提到的intel hex格局?认识了intel hex的格局后,完备可以或许自己写出身成hex文件的代码,以是这里就不贴出代码了),再挪用avrdude.exe把天生的intel hex文件烧录到eeprom。
上面给个详细的演示。

图2 烧录固件并指定Badusb履行举措

Executable处输入的字符串指导badusb履行的举措,这里badusb先按下Win+R键,期待500毫秒后输入powershell,按下回车键,期待600毫秒后输入Get-Date而后按下回车键,再输入echoabcdefghijklmnopqrstuvwxyz按下回车键,末了再次输入Get-Date和回车键。
至于界面中别的一些零散的参数笔者若何晓得的前面会说,实在不可完备可以或许一个一个测验考试。

后果演示***链接:https://v.***.com/x/page/l03900zm1pe.html

***没有演示badusb的伤害多大(比如从做事器***木马履行、盗取个人信息等),究竟这些更多的属于powershell剧本知识、cmd命令之类的,不是这篇文章的目标。

演示***中主要阅历了如下几个阶段:

1. 决议了avrdude.conf文件后partno和programmer下拉框会展现avrdude.exe支撑的芯片型号和编程器(编程器本色上是和bootloader通讯的协定)。

2. 插上开辟板(有提醒音)后,port下拉框会展现开辟板的串标语。

3. 在executable编纂框中输入badusb须要履行的按键序列”&500&$rcmd”,再抉择要烧录到FLASH的固件(只须要烧录一次固件,今后都不须要了),点击upload后两次弹出命令窗口停滞烧录(第一次烧录固件,第二次向EEPROM中写入数据),发明开辟板重启后弹出了运转对话框并输入了”cmd”。

4. 改动executable编纂框的内容为”&500&$rcmd;”(多了一个分号,也便是多按了一个回车键),再次点击upload(由于没有决议固件,以是不会停滞固件的烧录,只会改动EEPROM的数据),发明开辟板重启后弹出运转对话框紧接着敏捷弹出了命令窗口。

5. 之后又改动了两次executable编纂框的内容并烧录以改动EEPROM的数据,发明一次是只弹出了powershell窗口,一次是弹出了powershell窗口后又履行了三条powershell指令。

七、技巧展望

这次的示例只是展现了运用arduino leonardo开辟板模拟usb键盘,而windows一旦锁屏,模拟成键盘鼠标之类的badusb就生效了。
而有人发明在锁屏状况下拔出网卡会让windows操纵系统发送dhcp哀求给新拔出的网卡分派ip,那末是否是可以或许让usb装备模拟成网卡兼dhcp做事器兼dns做事器,到达在锁屏状况下通过badusb挟制流量、盗取信息的目标?固然有局限性,但是也阐明了一个成绩——badusb不但是简单地运用usb协定的马脚,还可以或许联合操纵系统的一系列特色(缺陷?)在看似不可能的环境下履行,badusb的技巧另有很多可以或许摸索的处所。

八、总结

1. 理一下思绪,要制造badusb,就要包管能编写出相应的固件并能通过某种手腕将固件烧录到usb装备中。
要想通过这两点,最便利的便是运用arduino或许teensy这类开辟板,不然就须要看有无民间的集成开辟环境,比如Cypress官网就供给了详细的开辟文档、示例、开辟环境等。

2. arduino开辟板主要运用的是atmel厂商的微节制器,编译工具和烧录工具也是来自开源名目avr libc。
可以或许在arduino ide中“文件->首选项->设置”勾上表现编译和上传的详细输入,而后运用ide的上传功效上传一个示例代码,在输入窗口就可以看到很多有用的信息。
附上一个示例:

图3 arduino ide详细输入信息(a)

3. 看到图4的输入信息,应该可以或许遐想到通过软件复位开辟板实在是通过以1200bps速率和开辟板停滞串口通讯,再进一步去看Windows串口通讯时发明还须要设置几个别的参数,这时若何办呢?只能看arduinoide是若何设置那些参数的,通过如下几个步调探求到arduino ide设置相关参数的源代码(arduino ide的源代码github上有):

①在源代码根目次运用findstr /Sn /c:”Foundupload port”查找含有字符串“Found upload port”的文件,发明道路为arduino-core\src\cc\arduino\packages\uploaders\SerialUploader.java:276:(findstr是Windows供给的在文档中查找字符串的工具)

②检讨Serial Uploader代码,发明字符串“Found upload port”在waitForUploadPort办法中,进一步发明挪用了waitForUploadPort办法的是uploadUsingPreferences办法,在uploadUsingPreferences办法中发明挪用了Serial.touchForCDCReset办法,通过办法名字预测这个函数和开辟板复位无关。

③再次运用findstr /Sn /c:”touchForCDCReset”找到touchForCDCReset办法的实现是在文件arduino-core\src\processing\app\Serial.java:90:中。

④在Serial.java中发明有这么一行代码:

serialPort.setParams(1200,8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

到这里可以或许年夜胆预测出运用串口通讯的方法复位开辟板时除1200这个参数值外别的参数的值了。

图4 arduino ide详细输入信息(b)

4. 通过图5可以或许看到arduino ide在挪用avrdude.exe烧录固件到我的开辟板时的一系列参数(-p便是partno,-c便是programmer,-b便是baudrate,可以或许发明和我前面演示时设定的参数是同样的,由于我的那些参数便是依据这里表现的设置的)。
有兴趣的可以或许看看“Arduino装置道路\hardware\arduino\avr”目次下的boards.***、platform.***和programmers.***,应该会有很多劳绩。

5. 想运用arduino开辟板制造有用的,或许扩大性强的badusb,须要理清如下逻辑:

①arduino开辟板运用的重如果atmel厂商的微节制器,而atmel厂商的微节制器集成为了SRAM,FlASH和EEPROM,此中arduino开辟板中的FLASH高地点寄存了某种bootloader,低地点则寄存用户上传到开辟板的固件;arduino开辟板的EERPOM可以或许依据自己的环境运用。

②arduino开辟板复位时,先启动bootloader,一段光阴(平日是几秒)后启动用户的固件。
而avrdude.exe烧录进程实在便是在复位时和arduino开辟板的bootloader通讯,以是只要在bootloader启动阶段运用avrdude.exe能力胜利烧录。
必定要节制好光阴。

③固件法度模范可以或许从eeprom或flash中读取数据,而intelhex格局文件可以或许节制将数据写入特定存储器的特定地点,运用这一点可以或许极大的扩大badusb的功效,并且将要履行的指令放在flash或许eeprom中也能在必定程度上起到暗藏后果。

标签:

相关文章

这究竟是什么雨丝

大自然便以其无穷的奥秘和壮丽景观吸引着人类的目光。在无数的自然奇观中,有一种被称为“雨丝”的现象,引起了人们的广泛关注。这究竟是什...

神马SEO 2025-01-08 阅读0 评论0