2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

admin 2024年2月16日00:17:39评论20 views字数 3533阅读11分46秒阅读模式

2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

做了一些逆向和工控题目

附件

链接: https://pan.baidu.com/s/1xit-r7KNkkUiHvWwc7WMrA?pwd=BFNB 提取码: BFNB

05

简单虚拟机逆向,结构体:

2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

image-20231031172703438

功能:

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[] = {
        0x730x750x6e0x640x6f0x730x6e0x610x700x780x6e0x730x6f0x640x6b0x730x680x670x640x73
    };
    unsigned char result[] = {
        0xD90xE10xD50xC90xF80xB80xD50xFD0xD30xF20xFD0xD00xB60xCF0xE40xF60x8B0xDD0xD30xF2
    };
    // 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 = [0xf00xf80x500x400x110xa40xf80x810x560xe50xd00x410x950xc50xf80xf8]
b = [0xB70x820x120x340x640xEE0x910xB40x0C0xD50xB70x2D0xCC0xB20xB60x8E]
flag = ''
for i in range(16):
    flag += chr(a[i] ^ b[i])

print(flag)
# GzBtuJi5Z0glYwNv

然后进入到第二阶段,逻辑很复杂,直接在异或运算打断点发现是跟后面的16字节进行异或:

c = [0x470x7a0x420x740x750x4a0x690x350x5a0x300x670x6c0x590x770x4e0x76]
d = [0x210x160x230x130x0E0x000x1C0x460x2E0x750x090x0F0x100x030x6F0x0B]
flag = ''
for i in range(16):
    flag += chr(c[i] ^ d[i])

print(flag)
# flag{JustEncIt!}

08

rop的方式走了多个函数,直接调试跟就可以,输入,然后异或0x53,+17,循环,结果和数据比对:

a = [0x460x500x430x450x390x7C0x750x760x480x7B0x730x410x410x8F0x430x460x780x730x8F0x770x410x760x480x8F0x420x430x730x420x8F0x710x460x7C0x730x7B0x760x430x480x740x770x410x7C0x3F0x00]
flag = ''
for i in a:
    flag += chr((i - 17) ^ 0x53)

print(flag)
# flag{876d91cc-af41-5c6d-ba1b-3f8196ad05c8}

09

输入数据,进行一组异或,然后用这个结果,去和20组的32个字符进行异或,比对'flag{'和这组数据的异或结果,提取出来数据之后得到输入,然后输入后得到flag:

2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

image-20231030135056201
# 打开数据文件并读取数据
with open("data.txt""r"as file:
    data = file.read().split()

# 将数据分割成每96个一组
grouped_data = [data[i:i+96for i in range(0len(data), 96)]

# 输出第一个分组作为示例
# print(grouped_data[0])
# print(len(grouped_data[0]))

a = 'SRzLZlKvlYHJqBqASzSqNgGXTGcKXoDe'
b = [0x0D0x540x2D0x7D0x7B0x5A0x7D0x650x660x590x510x7E0x7D0x420x210x4B0x680x7F0x600x690x410x75]
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

2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

image-20231030172817797

仿真跑起来发现停在这里了,尝试提交flag{"M0.2"}

11

发现异常进程shell.exe和影子账号test,尝试提交flag{"shell.exe"/"test"}

2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

原文始发于微信公众号(BeFun安全实验室):2023年工业信息安全技能大赛-钢铁行业锦标赛部分WP

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月16日00:17:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2023年工业信息安全技能大赛-钢铁行业锦标赛部分WPhttp://cn-sec.com/archives/2164622.html

发表评论

匿名网友 填写信息