2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP
做了一些逆向和工控题目
附件
链接: https://pan.baidu.com/s/1xit-r7KNkkUiHvWwc7WMrA?pwd=BFNB 提取码: BFNB
05
简单虚拟机逆向,结构体:
功能:
1:mov:
参数2:
1:reg1=参数3
2:reg2=字符表[reg1]
3:reg3=input[reg1]
4:结果[reg1]=reg2
ip += 3
2:add
参数2:
1:reg2 += 参数3
2:reg1 += 参数3
ip += 3
3:sub
reg3 -= 参数2
ip += 2
4:xor
reg2 ^= reg3
ip += 1
5:not
reg2 ~= reg2
ip += 1
6:cmp
状态寄存器 = 参数2 >= reg1
ip += 2
7:jl
if 状态:
ip = start
else:
ip = ip + 1
字符表:sundosnapxnsodkshgds
然后指令:
110 mov reg1, 0
120 mov reg2, ch[reg1]
215 add reg2, 5
5 not reg2
130 mov reg3, input[reg1]
38 sub reg3, 8
4 xor reg2, reg3
140 mov result[reg1], reg2
221 add reg1, 1
6(14h) cmp reg1, 0x14
7 jl start
38 sub reg3, 8
result[i] = ~(ch[i] + 5) ^ (input[i] - 8)
input[i] = (~(ch[i] + 5) ^ result[i]) + 8
#include <stdio.h>
int main(){
unsigned char ch[] = {
0x73, 0x75, 0x6e, 0x64, 0x6f, 0x73, 0x6e, 0x61, 0x70, 0x78, 0x6e, 0x73, 0x6f, 0x64, 0x6b, 0x73, 0x68, 0x67, 0x64, 0x73
};
unsigned char result[] = {
0xD9, 0xE1, 0xD5, 0xC9, 0xF8, 0xB8, 0xD5, 0xFD, 0xD3, 0xF2, 0xFD, 0xD0, 0xB6, 0xCF, 0xE4, 0xF6, 0x8B, 0xDD, 0xD3, 0xF2
};
// input[i] = (~(ch[i] + 5) ^ result[i]) + 8
for (int i = 0; i < 20; i ++){
printf("%c", (~(ch[i] + 5) ^ result[i]) + 8);
}
return 0;
}
07
mips的逆向,用qemu-mips启动调试,ghidra反编译,流程如下:
输入数据和一组数据异或然后比对:
a = [0xf0, 0xf8, 0x50, 0x40, 0x11, 0xa4, 0xf8, 0x81, 0x56, 0xe5, 0xd0, 0x41, 0x95, 0xc5, 0xf8, 0xf8]
b = [0xB7, 0x82, 0x12, 0x34, 0x64, 0xEE, 0x91, 0xB4, 0x0C, 0xD5, 0xB7, 0x2D, 0xCC, 0xB2, 0xB6, 0x8E]
flag = ''
for i in range(16):
flag += chr(a[i] ^ b[i])
print(flag)
# GzBtuJi5Z0glYwNv
然后进入到第二阶段,逻辑很复杂,直接在异或运算打断点发现是跟后面的16字节进行异或:
c = [0x47, 0x7a, 0x42, 0x74, 0x75, 0x4a, 0x69, 0x35, 0x5a, 0x30, 0x67, 0x6c, 0x59, 0x77, 0x4e, 0x76]
d = [0x21, 0x16, 0x23, 0x13, 0x0E, 0x00, 0x1C, 0x46, 0x2E, 0x75, 0x09, 0x0F, 0x10, 0x03, 0x6F, 0x0B]
flag = ''
for i in range(16):
flag += chr(c[i] ^ d[i])
print(flag)
# flag{JustEncIt!}
08
rop的方式走了多个函数,直接调试跟就可以,输入,然后异或0x53,+17,循环,结果和数据比对:
a = [0x46, 0x50, 0x43, 0x45, 0x39, 0x7C, 0x75, 0x76, 0x48, 0x7B, 0x73, 0x41, 0x41, 0x8F, 0x43, 0x46, 0x78, 0x73, 0x8F, 0x77, 0x41, 0x76, 0x48, 0x8F, 0x42, 0x43, 0x73, 0x42, 0x8F, 0x71, 0x46, 0x7C, 0x73, 0x7B, 0x76, 0x43, 0x48, 0x74, 0x77, 0x41, 0x7C, 0x3F, 0x00]
flag = ''
for i in a:
flag += chr((i - 17) ^ 0x53)
print(flag)
# flag{876d91cc-af41-5c6d-ba1b-3f8196ad05c8}
09
输入数据,进行一组异或,然后用这个结果,去和20组的32个字符进行异或,比对'flag{'和这组数据的异或结果,提取出来数据之后得到输入,然后输入后得到flag:
# 打开数据文件并读取数据
with open("data.txt", "r") as file:
data = file.read().split()
# 将数据分割成每96个一组
grouped_data = [data[i:i+96] for i in range(0, len(data), 96)]
# 输出第一个分组作为示例
# print(grouped_data[0])
# print(len(grouped_data[0]))
a = 'SRzLZlKvlYHJqBqASzSqNgGXTGcKXoDe'
b = [0x0D, 0x54, 0x2D, 0x7D, 0x7B, 0x5A, 0x7D, 0x65, 0x66, 0x59, 0x51, 0x7E, 0x7D, 0x42, 0x21, 0x4B, 0x68, 0x7F, 0x60, 0x69, 0x41, 0x75]
c = 'flag{'
d = []
for i in range(5):
d.append(ord(c[i]) ^ b[i])
for i in grouped_data: # 取一组数据
tempA = []
ch = ''
for j in range(5):
tempA.append(int('0x' + i[j], 16) ^ b[j])
ch += chr(int('0x' + i[j], 16) ^ b[j])
if ch == 'flag{':
flag = ''
for j in range(22):
flag += chr(ord(a[j]) ^ int('0x' + i[j], 16))
print(flag)
# Flag is : flag{RnVPvjUysd3AwqnX}
10
仿真跑起来发现停在这里了,尝试提交flag{"M0.2"}
11
发现异常进程shell.exe和影子账号test,尝试提交flag{"shell.exe"/"test"}
原文始发于微信公众号(BeFun安全实验室):2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论