XMan2017夏令营结业攻防赛Babyblog出题思路&WriteUP

XMan 2017 AWD Babyblog author’s turtoral & writeup

0x00 出题思路

常见一句话木马

一句话木马是在日常攻击和渗透中使用的最广泛的一类木马,其具有代码量小,变形多,易隐藏等特性。这类一句话木马多为通过eval或类似命令直接执行对应语言的字符串代码,达到可以执行任意命令的效果。在本题中,我一共放置了四种不同类型的一句话木马:

常见大马

相比于小马,这类木马通常体积稍大,更不易隐藏。但其中可以包含更多加密和混淆的措施,使攻击行为更不容易被察觉。在本题中,我放置了一个Weevely木马,其密码为xman1234

在这段大马中,$Q$l均为字符串。Weevely借助PHP可以将函数名字符串用作类似函数指针的特性,来构造木马。

任意文件包含

任意文件包含多为服务端程序在开发时没对可包含目录和文件做限制,导致可以读取任何文件。一般的表现形式为http://localhost/page=index或类似方式。本题中,我们在博客文章中引入了正文模板,这里的模板就具有文件包含漏洞。

任意文件上传

任意文件上传多为服务端程序在开发时,未对可上传文件的扩展名进行限制,导致可以上传服务器脚本,并通过HTTP访问执行。本题中,我们在博客文章图片上传处未对可上传文件做限制。

服务端请求伪造

服务端请求伪造是指在开发过程中,有些用户提交的资源(如图片,文字等)需要加载到服务器本地进行处理,但服务端并未对资源地址进行限制,导致的可以探测服务器内网或任意本地文件读取。本题中,我们设计了/resolve_image这个调用,但是并没有制作相应的前端页面。

0x01 审计与防御方式

常见一句话木马

可以通过grep或find等命令搜索相关关键字(如eval, system, passthru, $_POST, $_REQUEST)等,来快速定位相关位置,随后对源码进行审查。这类木马通常不会影响程序运行逻辑,因此可以直接删除相关代码。

常见大马

基本方法同小马,但由于大马结构复杂,更加需要平时的积累和人工分析能力。这类木马通常不会影响程序运行逻辑,因此可以直接删除相关代码或文件。

任意文件包含

可以通过grep或find等命令搜索相关关键字(如include, require)等,来快速定位相关位置,随后对源码进行审查。但因为这类关键词几乎在所有的代码文件中都存在,审查难度相对较大。但由于任意文件包含一般出现在业务逻辑内,与常用库的包含方式有所区别,有能力的团队可以开发一些审计工具,对其特征进行审计,也可以从业务逻辑入手对相关代码进行审计。由于这类问题会影响程序运行逻辑,因此需要选手理解题意,根据题目的业务逻辑修复代码或添加防御措施。

在本题中,容易发现系统自带的三个模板均以[0-9]\.tpl命名,因此在相关业务逻辑中,对提交的模板名称进行过滤即可。具体的位置如下。

在这两个函数中,对$data['template']提供的文件名进行正则匹配过滤即可。

任意文件上传

可以通过grep或find等命令搜索相关关键字(如upload, $_FILES, move_uploaded_file, move)等,来快速定位相关位置,随后对源码进行审查。这类漏洞一般比较容易进行审查,相关关键词即可大致定位可能出现问题的位置。由于这类函数用途很多,因此审计难度也相对较大。建议从业务逻辑入手对相关代码进行审计。由于这类问题会影响程序运行逻辑,因此需要选手理解题意,根据题目的业务逻辑修复代码或添加防御措施。

在本题中,容易发现博客文章图片上传功能未对文件类型进行过滤,我们需要修改相关代码,过滤掉可能导致上传木马文件的扩展名。

这里可以简单的过滤$safeName中是否包含'php'等可作为脚本运行的文件扩展名字符串,发现问题直接返回错误即可。

服务端请求伪造

可以通过grep或find等命令搜索相关关键字(如file_get_content, curl)等,来快速定位相关位置,随后对源码进行审查。但由于这类函数用途很多,因此审计难度也相对较大。建议从业务逻辑入手对相关代码进行审计。由于这类问题会影响程序运行逻辑,因此需要选手理解题意,根据题目的业务逻辑修复代码或添加防御措施。

在本题中,此漏洞并不存在前端调用,因此只能对代码进行审计。可以发现在/resolve_file请求对应的处理函数中存在此类情况。

可以发现这里file_get_contents直接传入了请求参数,而未对其做过滤,因此可能导致任意文件读取。这里可以通过检查$data['resolve_file']的开头是否为'http'并且对'localhost', '127.*.*.*'等相关的内网域名、IP等进行过滤。

0x02 漏洞利用方式

1. index

2. 404

在比赛现场由于部署时使用了php7, preg_match的r选项已无法使用,因此该漏洞失效。

3. upload_image

直接上传一句话木马,随后通过一句话木马利用。

4. weevely in autoload_real.php

随后通过weevely直接读flag

5. Post checker=shellcmd in autoload.php

6. template any file require

http://localhost:21000/posts/create在发布文章时修改提交的模板值

随后新发布的文章中就会包含flag的值

7. resolve_file SSRF

随后根据返回的json文件中file_path的值下载文件后base64解码即为flag

 

0x03 总结

这次出题难度属于较为简单的,考察的也是最基础的一些常见web注入点。但由于时间关系和比赛性质,没有对XSS,CSRF,SQL注入等知识点进行考察,且所有的漏洞点均为可直接利用,没有需要二次利用的漏洞。以后可能会尝试出一些和密码学/misc/pwn相结合的web攻防题。最后也恭喜在这次夏令营中取得优异成绩的各位大师傅!

Appium在Android UI测试中的应用

Android测试工具与Appium简介

Appium是一个C/S架构的,支持Android/iOS Native, Hybrid 和 Mobile Web Apps的测试框架,与测试程序通过Selenum Webdriver协议通讯。Webdriver的好处是通过HTTP RPC的方式调用Server上的过程,编写测试脚本不受语言的限制,无论是Python, Java, NodeJS均可以方便的编写测试。本文中将使用Python进行编程。

起因是因为市场部的同事抛来如下需求:批量添加一些微信好友。直接抓取请求进行重放的方法是不靠谱的,微信与服务端的通讯均加密,Pass。考虑使用xposed等框架hook相关函数进行操作。但是xposed需要越狱,且开发复杂,Pass。后来想到了使用UI测试工具进行模拟操作,开发较为简单。

Android UI测试工具有很多种,如Monkey, UIAutomator, Selendroid, Robotium等。其中UIAutomator, Monkey, Selendroid均为非侵入式的UI测试,也就是不需要修改源代码,只要安装了目标程序就可以进行测试。Robotium需要与源码一同编译测试。Appium实际上就是一个测试工具的统一调度软件,将不同的非侵入式测试工具整合在一起,对外提供统一的API。在Android 2.3以前的版本,Appium会调用Selendroid,之后的版本会直接使用UIAutomator,iOS下使用UIAutomation。Appium还支持FirefoxOS的UI测试。

Appium Gif

安装Appium

官网给出了命令行下的安装方法。但实际上Appium有GUI版本,更适合在Windows/MacOS下使用。Windows下需要安装.NET Framework。

Appium需要依赖Android SDK编译在手机端运行的两个插件,因此需要首先安装相应的Android SDK版本。这里直接使用了Android Studio中自带的SDK Manager。在SDKManager中选择和测试机相对应的SDK Platform和较新的Build-tools,如果需要使用模拟器测试还要装对应的ARM/x86 System Image,以及Intel HAXM Installer,用于加速x86虚拟机。Appium使用adb来与目标机器通讯,因此对于真机和模拟器操作几乎都是相同的,如何建立模拟器在此不再赘述。

安装完成后需要在Appium GUI中配置Android SDK目录,随后选择Android,点击Launch就可以启动Appium Server。

Appium-android-sdkAppium-launch

Appium Server默认会监听http://localhost:4723 ,用于RPC通讯。下面我们就可以打开熟悉的编程环境,编写UI测试用例了。这里使用Python进行编写,需要先安装Appium的Python Client  ,然后再python中使用appium.webclient就可以连接Appium server了。

使用Appium进行UI控制

根据注释修改相应属性后即可运行测试。手机需要打开ADB调试,执行完以下代码后,Appium会在手机上安装Appium Settings和Unlock两个程序,随后微信会被启动。

Selenum Webdriver使用了一种类似于JS中的DOM模型的方法来选择页面中的元素。dr为当前正在活动的activity对象,可以使用findElementByXXX的方法来获取Activity中的元素。所有Element后带s的函数,均获得所有匹配的元素,不带s的函数获得第一个匹配的元素。

查询函数

1. findElement(s)ByName

在Android中基本没用。Android UI没有Name这个属性。有说可以使用text值获取。但我并没有成功

2. findElement(s)ByClassName

通过类名来获取元素,用法如下:

3. findElementById

通过resource_id来获取元素,每个Activity中都是唯一的,用法如下

4. findElement(s)ByAccessbiltiyId

在Android上AccessbilityID实际就是contentDescription。这个属性是为了方便视力受损人士使用手机所设置。开启TTS后系统会朗读相关控件的contentDescription。

5. findElement(s)ByXPath

通过XML Path描述来寻找元素。我没有成功的获取到,可能是XPath写的有问题。

6. findElementByAndroidUIAutomator

通过UIAutomator的选择器来获取元素。因为Appium在Android上实际是调用的UIAutomator,所以可以通过UIAutomator的选择器来选择元素。

操作函数

操作函数用于操作选定的元素,有很多,以下仅列举几个,更多的请查阅手册。

  1. click
  2. send_keys
  3. clear

查询函数返回的元素对象可以像JS中的dom元素一样,继续使用查询函数来选定其子元素。用例如下。

如何确定查询规则

了解了相关的函数后,下面就应对UI进行定位了。如果是自己团队开发的程序,推荐让开发同学在所有的空间上都添加resource_id进行绝对定位。如果碰到没有谈价resource_id的元素,那就要使用别的办法进行定位了。

1. UI Automator Viewer

UI Automator Viewer是Android官方的UI定位工具,位于sdk/tools下。运行后会打开viewer界面。点击获取按钮即可获取当前正在运行的Activity的UI结构。

uiviewer

2. AppiumDriver getPageSource

AppiumDriver(Client) 可以很方便的获得当前正在运行的Activity的UI描述,随后可根据返回的XML文档来寻找元素。

getSource

(图片与他人,侵删)

确定元素位置后,即可根据前述的Find方法来查找/选择元素

编写完整的测试代码

正确的获取元素之后便可以获取元素相关的信息,随后使用各语言常用的测试框架编写测试即可,如Java的JUnit,Nodejs的Mocha等。

这里我使用Appium主要是为了模拟用户点击添加微信好友,所以完整的程序并没有使用到测试框架。相关的UI元素获取/操作方法供大家参考。

 

博客全面迁移并启用https链接

博客现在已经迁移到了阿里云青岛9.9学生服务器。

使用StartCom StartSSL证书用于https加密链接。

附上nginx通过ssllabs A+测试的配置文件

 

SSL Server Test- summershrimp.com (Powered by Qualys SSL Labs)

HttpLuaModule在Coding WebIDE中的应用

0x00 前言

HttpLuaModule又名ngx_lua,由国人大神agentzh(章奕春)开发。ngx_lua将lua脚本语言嵌入nginx中,并用lua封装了部分nginx的API,使nginx开发不再需要繁琐的C语言进行。目前,ngx_lua在阿里cdn,又拍云cdn中均发挥了极大的作用。

Coding作为一个技术导向的创业公司,也在Coding WebIDE混合架构中使用了ngx_lua。

0x01 ngx_lua介绍

ngx_lua 通过在nginx的处理阶段中使用lua或luajit(推荐)插入lua脚本,对当前阶段的请求进行处理,使nginx具有更复杂的逻辑功能。由于lua的紧凑、快速以及内建协程,所以在保证高并发服务能力的同时极大地降低了业务逻辑实现成本。

推荐阅读浅谈 ngx_lua 在 UPYUN 的应用

0x02 应用背景

Coding WebIDE是国内第一个基于Web的集成开发环境(IDE),目前提供给用户一定的代码储存空间和一个完整的Ubuntu Terminal用于在线调试

由于IDE在使用的过程中存在状态,因此每个用户的每个Workspace必须存放在某台固定的机器上。这就要求Balancer将用户每次分配到相同的机器上。

在引入ngx_lua前,Service会在用户创建Workspace时将用户所在的机器名返回给Web UI,Web UI在每次Ajax请求的时候会带上X-Space-KeyX-Sharding-Group两个HTTP Header,nginx在请求中根据X-Sharding-Group的值来选择对应的Service。这里将后端的机器名暴露给了用户,带来了安全隐患。

Coding WebIDE还有一个生成访问URL的功能,可将用户在Terminal中启动的Http Application暴露在公网中,供用户调试使用。

在引入ngx_lua前,每次对访问URL的请求都会进入Service,由Service找到对应Container的IP,并通过X-Accel-Redirect的方式通知每个Service中的nginx,去返回目标Container中的服务。而在这个过程中,用户的请求会两次经过Service层的nginx,造成较大的延时。

0x03 ngx_lua的应用

Balancing

我们使用ngx_lua将原本需要在X-Sharding-Group头中的backend地址去掉,通过ngx_lua在数据库和缓存中检索X-Space-Key来找到对应的Service,并将upstream设为对应机器,杜绝了请求中带有Service机器名带来的隐患。同时,Redis作为缓存的加入并不会导致性能有太大的降低。

 

 

Access URL

Access URL在引入ngx_lua后,性能得到了极大的提升。在用户生成了Access URL后,Service会将相关数据缓存入redis,在用户访问URL时,将由Frontend Balancer直接寻找对应container的信息,并直接要求Backend Service返回对应的请求。

原本需要nginx转发两次的请求现在只需要一次就可以到达。大大提升了用户的体验。

WebSocket

由于WebSocket不能自定义Header,所以使用了类似于Access URL的方法进行Balancing。Web UI在建立WebSocket时所需的握手时间也有一定的降低。

0x04 ngx_lua的踩坑经历

cosocket在不同阶段的可用性

resty.mysql和resty.redis均采用了nginx中提供的cosocket进行socket链接。但cosocket并不是在每个nginx的访问阶段都可用。在我们第一版测试的时候使用了set_by_lua直接对nginx变量进行赋值。但是在这个阶段只能使用redis_lua和luasql.mysql进行访问。但这两个模块使用了lua原生的socket库,并不能复用nginx的socket链接。而且由于ngx_lua的特殊性,无法在外部模块中使用连接池,导致链接开销过大,速度降低等问题。

因此,我们将原在set_by_lua中执行的任务使用access_by_lua的方式重写,使用了复用cosocket的openresty系列库。

sql和redis的连接池

由于ngx_lua的特殊性,无法使用传统意义上的连接池。但是openresty提供了基于cosocket的连接池,可以减少每次重连造成的开销。

使用如上代码关闭resty.redisresty.mysql的链接便可将cosocket链接放入连接池,等待下次connect。

生产和开发环境不一致

根据官方文档,生产环境需要打开lua_code_cache。但是开发环境可以不打开lua_code_cache。当不打开code cache时,每次请求都会重新加载lua文件,这使得lua文件可以获得及时的更新。

在我们的测试中,当生产环境打开code cache后,部分

0x05 总结

综上,集成lua的nginx可以完成很多之前需要在Backend Service中完成的功能,可以减少不同模块之间的耦合度,还能一定程度上提升应用性能。

lua的开发周期和成本也比用C开发nginx模块要低得多,便于快速上线和迭代开发。因此,不妨尝试将部分业务放入ngx_lua中完成。

交换两数位运算快还是赋值快?

从初高中的OI到大学中的ACM,队友中都流传着交换变量用位运算要比用赋值速度快。不少人对此深信不疑。但这真的是真的么?今天就来从理论上分析这个问题的真假。

先附上今天所要测试的程序段:

编译环境:

先是赋值交换

然后是位运算交换

由于这里只是程序片段,就不再生成可执行文件。使用clang编译获得汇编文件来进行对比。

首先,我们不开编译优化,看看编译后的结果。(clang %s.c -S -o %s-no.s -m32)

赋值交换:

位运算交换:

很明显,赋值交换的指令数量已经比位运算交换少了不少。(待补充汇编代码分析)下面我们再打开第一级编译优化(clang %s.c -S -o %s-o1.s -O -m32)来试一下:

赋值交换:

 

位运算交换:

赋值发在完成两个方法相同的寄存器变量准备步骤后,赋值法仅用了两个mov指令就完成了变量交换。而位运算法执行了三个xor两个mov指令才完成交换。

因此,位运算交换两数并不比赋值法快,特别在编译优化优秀的编译器上,中间变量完全可以使用寄存器优化掉。因此,放弃用位运算作交换的念头吧。

2015新年祭

2014年过去了,在这一年中,虽然代码写的不多,但是收获了更多的朋友。Python 和 Node也是新技能get。貌似大学里第一次有补考不过的记录也是这一年。我写这些东西就是喜欢东一句西一句。还是写跟技术有关的东西比较顺畅。觉得语文真的应该好好练练了。其实写跟技术有关的东西也是图片和代码占据了大部分。都说无图无真相。你们要是觉得这个读起来很费劲也别怪我。下面是简单列了一个这一年都干了啥的单子,当然这都是些比较大的事情。帮同学写个课设啥的都不会写在下面。

  1. 2014.03 来人外卖平台
  2. 2014.04 ACM/ICPC湘潭赛区邀请赛
  3. 2014.05 第三届中国软件杯大学生软件设计大赛
  4. 2014.07 中国软件杯大赛评分系统
  5. 2014.09 阿斯图-相聚圣彼得堡中俄大学生游戏开发大赛
  6. 2014.10 JCTF金陵科技杯信息安全大赛
  7. 2014.11 信息安全讲座部分技术展示
  8. 2014.11 第三届江苏省信息安全技能竞赛大学组
  9. 2014.11 电子电路设计大赛校赛
  10. 2014.12 组织TEDxNUAA分享会
  11. 2014.12 参加iOSCon2014 iOS开发者交流会
  12. 2014.12 学院科创开题大会演讲嘉宾
  13. 2014.12 攻氪|HACK 黑客马拉松

2015年有是新的一年,这一年也算是开了个好头,至少这学期成绩单木有挂科的。还给一个挺好玩的开源项目交了一个PR,虽然后来还是麻烦人家原作者把整个结构都给改了。毕竟是我第一次用python正儿八经写东西。2014年拖欠的各种比赛奖金也都发下来了。然后就请客请客出去玩就花掉了好多好多好多。寒假放假后也在南京疯玩了好久,又浪到北京疯了一阵才浪回家。回家后写了人生中第一份简历。虽然自己看着挺搓的,因为真的是挺搓。但好歹也是第一份,投给了阿里云。第一次啊就这么给了阿里,阿里你要是不给我过我就真的是好伤心。

2015半年期目标应该比2014年要明确的多

  1. 在ICCCS上发表一篇论文
  2. GSoC 2015
  3. WAF科创尽量完成
  4. TechInnoMS项目维护好

其实还注册了浪潮的超级计算的比赛。但是真的一点动力都木有啊。。三月中旬就要交proposal了我们基本还没动。根本不知道要做什么学校根本没有相关的积累唉唉唉。但是因为这个去北京浪的那一圈还是学到了很多东西。

现在还都是从零开始呢。希望不会被自己的拖延症搅和。新的一年加油干爸爹!

(但愿2015能在一直不忍下手的前端和移动APP上也下点手(虽然上半年肯定没戏了))

白菜哥的新年独享100块解谜红包WriteUp

白菜哥的新年大红包由两部分组成,

Part1:[F1129B4C724435598515598630AC61A8]

Part2:

白菜哥红包Part2

 

扫描二维码后得到网址http://7sbxnl.com1.z0.glb.clouddn.com/dahongbao.txt

下载TxT,打开后发现是Base64编码后的文字。

Part2-1

使用Base64解码后,用file命令查看文件类型。得知是win32下压缩的rar压缩包。

打开压缩包后,发现文件有密码,无法继续进行。

Part2-2

回归Part1下手,容易发现Part1是使用摘要算法后的Hash。实际这里使用的是md5。在cmd5等查询网站查询均无结果。将Part1直接拖入百度搜索,得到如下结果:

Part1-1

得到hash对应的字符串:

这里加密采用了Qwerty键盘和Dvoark键盘的映射加密。根据对应规则解密得到

将顺序颠倒后便是

根据之前发布的提示,rar密码为c0d1ng。解压rar获得havefun.txt。打开后看到“This program cannot be run in DOS mode.”便知道为Windows 可执行文件,与file命令得到的类型一致。修改后缀为exe。运行后弹出错误提示。

Part2-3-1

考虑到可执行文件无法执行,可能为PE头错误,用二进制编辑器打开havefun.exe,发现其中一个偏移量9000有问题,对应位置应为8000,修复后保存

Part2-3-2

运行后可获得一串数字,且没有数字大于7,因此考虑为八进制数。

170157 122707 113150 24304 107577 166230 112777 167224 131307 136626 167174 126377

反汇编原始程序,定位到main()入口,发现循环调用了part1函数,并且输出part1的返回值,共循环12次,输出使用”%o”格式化。

Part2-5

定位到part1函数,发现part2函数将传入参数加7dfh后返回。7dfh=2015d。因为今年是2015年,猜测加密函数f(x) = x+2015,因此将上面的八进制串每个都减掉7dfh。

Part2-5-2

得到十六进制的数字串

E890 9DE8 8E89    20E5    87A0 E4B9 8E20 E6B5 AAE8 B5B7 E69D A520 E587 A020 E59D 97E9 92B1 20EF BC9F。

每两位分割添加%号并且url解码后得到中文

“萝莉 几乎 浪起来 几 块钱 ?”

这一层加密采用的是拼音与T9的对应。萝莉为loli 对应56 54 ,几乎 对应54 48, 浪起来 对应57 51, 几 对应54  块钱 对应57。56 54 54 48 57 51 54 57再查ascii码表发现全部为数字,86609369,为最终的红包密码。

总的来说最后一步需要一定的运气。其他的步骤还算正常。很可惜没有人在10小时内拿到这个一人独吞100元大红包。

矩阵迷宫生成算法

脑残的数据结构课设要做个什么脑残的非递归迷宫问题求解。最脑残的是还让自己去生成一个迷宫。于是有了这篇文章。

言归正传。先介绍一个神奇的数据结构叫“并茶几” 哦不,“并查集”。并查集是一中用于判断元素是否属于同一集合的数据结构,主要的操作有查找和合并。并查集实际上是一个森林,每一个集合是一棵树。

在并查集中,默认每个元素的父元素指向自己,在执行合并操作的时候只需要将自己的父元素指向要合并的节点,即可完成合并。在执行查找的时候,只需要一直寻找父元素,直到父元素指向父元素本身。

但是当合并次数增多以后,可能会出现树的深度过大,导致每次回溯父节点耗时过长。这里有一种路径压缩的办法。在执行find的时候,将每个节点的父节点都改为最远处的父节点。在递归执行查找的时候只需要很小的改动即可。

还有一种按秩合并的算法可以优化并查集。但是远没有路径压缩简单易懂,在小规模数据时无需使用。

下面提供了一个简单封装过的并查集类。

说完了并查集就该让我们谈谈怎么去生成迷宫了。

迷宫实质上就是从原点到重点的一科生成树,生成树中的所有节点必属于同一个集合。于是借助并查集和随机数构造迷宫。

在生成迷宫时,我们随机选择一堵墙,并把墙打通,隔开的两个格子在并查集中合并。直到原点和终点在同一个集合中。

迷宫

以上就是用这种方法生成的迷宫矩阵。原点为(0,0),终点为(15,15)。迷宫通路较为曲折,下面是用深搜获得的解。

迷宫,解

 

这个生成算法有个缺点,因为相邻的两个点之间必有墙,所以只能生成奇数乘奇数的矩阵。如果有能生成偶数矩阵的算法,欢迎在下面留言讨论。

将简易的Teensy脚本刷入Arduino

首先,你需要有个Arduino Leonardo或者SparkFun Pro Micro

pro micro

Leonardo

 

然后,你需要kali的Social-Engineer Toolkit来生成几个脚本

如下选择

这个选择会生成一个模拟键盘构造vbs脚本从服务器上下载x.exe然后执行的BadUSB脚本。再输入一些必要的信息后,就会在~/.set/reports/ 目录下面生成arduino的程序。

但是这个程序是供teensy使用的,我们需要对他进行一些改造。我们发现,程序的主要执行部分都在setup()函数中,在使用leonardo目标build的时候会提示keyboard中没有某些成员函数。于是我们就要将此部分改写。这里我已经把omg函数和ascii_println函数改写过了。改写过后的程序如下

我们使用改写过的代码编译上传,并且在http服务器中存放好用于攻击的exe文件,插上我们的BadUSB后,便会自动实施攻击。用这个BaD设备去捅你的小伙伴的电脑吧!

但是目前这种改写只能适用于简单的脚本。如果生成内嵌payload的teensy脚本则很难改写。正在尝试将teensy的库移植到leonardo上。目前基本完成但尚未测试。测试通过后会发布出来。目前也正在尝试群联某方案上的攻击漏洞。期末考完试后考虑做一款内置储存的BadUSB设备。理论上比普通U盘贵30-40元左右。