姓名:石廷澳 学号:21011210031 学院:通信工程学院
【嵌牛导读】今天调PPPoe攻击的发现阶段,调了一天,踩了一天的坑,主要是自己第一次接触有MAC核的工程。今天就记录一下。
【嵌牛鼻子】PPPoe攻击调试记录
【嵌牛提问】如何避免跳进以太网数据帧的坑
【嵌牛正文】
引言
今天调PPPoe攻击的发现阶段,调了一天,踩了一天的坑,主要是自己第一次接触有MAC核的工程。今天就记录一下。本人写PPPoe攻击仅作为学习使用,不做其他危害国家社会的事情!!!
MAC核复位
MAC核的复位是高电平复位 ,而我的PPPoe的.v文件是低电平复位,这个bug调了一上午。我在modelsim上仿真没有问题,电脑向我发PADI数据帧,逻辑上FPGA模仿服务器应该发送PADO数据帧,但是Wireshark什么帧也没有抓到,也就是说没有触发我的状态机。一开始以为数据没有从MAC传给我,然后在vivado上抓信号,发现数据已经接收了,也就是说MAC没有问题,我代码逻辑的问题。最后突然想起一个比较被人忽略但确实最重要的信号,也就是复位信号。
这是MAC核其中一个always块,很显然里面复位是高电平复位,而我的复位默认是低电平复位,导致我的代码一直处于复位状态,状态机没有跳转,发送PADO数据帧的状态没有被触发。BUG定位于此。
以太网无用帧
当用网线连接两个设备,设备会定期发送无用帧来保持链接。 FPGA发送PADO帧,用vivado抓到发送的帧有很多杂数据,里面有我发的数据,也有很多不是我发的数据。一开始以为是我手写FIFO的问题,然后用vivado的FIFO ip核替换,结果还是这样,当快被定位到玄学问题的时候,发现Wireshark抓到了UDP帧。然后按帧类型为触发条件抓信号,发现果然这个UDP帧的载荷写进了FIFO(我把载荷存到FIFO中,需要的时候再读出来)。也就是说我的写FIFO条件松了,加上帧类型后没有问题。
以太网最小帧长
以太网最小帧长是64个字节,不足64个字节都会补0补成64个字节,但是Wireshark抓到的帧不会显示补的0。 读FIFO的时候回读出好多0,最后发现是这个问题,然后写FIFO就多加了个条件,按照帧长进行写使能。
欺骗用的MAC地址
PPPoe要用一个MAC地址当做自己的服务器地址,因为测试的时候也没注意,所以就顺便起了个48位的MAC地址,以为没有问题,因为MAC地址有好多。但是FPGA发PADS帧,Wireshark能抓到,但是帧里面会报错,说不符合IEEE标准。然后到网上搜了一下,发现MAC的每位数据都是有含义的,所以不能乱给。于是用了自己电脑的MAC地址,没有什么问题。
如下图所示,其前3字节表示OUI(Organizationally Unique Identifier),是IEEE的注册管理机构给不同厂家分配的代码,区分不同的厂家。后3字节由厂家自行分配 。
MAC地址最高字节(MSB)的低第二位(LSb)表示这个MAC地址是全局的还是本地的,即U/L(Universal/Local)位,如果为0,表示是全局地址,所有的OUI这一位都是0。MAC地址最高字节(MSB)的低第一位(LSb),表示这个MAC地址是单播还是多播,0表示单播。
以上就是今天遇到的BUG,收获颇多!