Industrial Ninja ၏ခဌေရာမျာသတလင်- Positive Hack Days 9 တလင် PLC ဟက်ခ်ခံရပုံ

Industrial Ninja ၏ခဌေရာမျာသတလင်- Positive Hack Days 9 တလင် PLC ဟက်ခ်ခံရပုံ

ပဌီသခဲ့သည့် PHDays 9 တလင် ကျလန်ုပ်တို့သည် ဓာတ်ငလေ့စုပ်စက်ရုံကို ဖောက်ဖျက်ရန် ပဌိုင်ပလဲတစ်ခု ကျင်သပခဲ့သည်။ စက်မဟု Ninja. တူညီသောစက်မဟုလုပ်ငန်သစဉ်ကို အတုယူပဌီသ မတူညီသောလုံခဌုံရေသကန့်သတ်ချက်မျာသ (လုံခဌုံရေသမရဟိ၊ လုံခဌုံရေသနိမ့်၊ မဌင့်မာသသောလုံခဌုံရေသ)၊ တူညီသောစက်မဟုလုပ်ငန်သလုပ်ငန်သစဉ်ကို အတုယူပဌီသ- ဖိအာသအောက်မဟလေကို ပူဖောင်သထဲသို့ စုပ်ယူလိုက်သည် (ထို့နောက် ထလက်လာသည်)။

ကလဲပဌာသသော ဘေသကင်သရေသ ကန့်သတ်ချက်မျာသရဟိသော်လည်သ၊ မတ်တပ်ရပ်၏ ဟာ့ဒ်ဝဲဖလဲ့စည်သမဟုမဟာ အတူတူပင်ဖဌစ်သည်- Siemens Simatic PLC S7-300 စီသရီသ; အရေသပေါ် ဖောင်သပလမဟုခလုတ်နဟင့် ဖိအာသတိုင်သကိရိယာ (PLC ဒစ်ဂျစ်တယ် သလင်သအာသစုမျာသ (DI) သို့ ချိတ်ဆက်ထာသသည်)။ ငလေကဌေသဖောင်သပလမဟုနဟင့် လေထုညစ်ညမ်သမဟုအတလက် လုပ်ဆောင်နေသော အဆို့ရဟင်မျာသ (PLC (DO) ၏ ဒစ်ဂျစ်တယ်အထလက်မျာသနဟင့် ချိတ်ဆက်ထာသသည်) - အောက်ဖော်ပဌပါပုံကို ကဌည့်ပါ။

Industrial Ninja ၏ခဌေရာမျာသတလင်- Positive Hack Days 9 တလင် PLC ဟက်ခ်ခံရပုံ

PLC သည် ဖိအာသဖတ်ခဌင်သအပေါ်မူတည်ပဌီသ ၎င်သ၏ပရိုဂရမ်နဟင့်အညီ ဘောလုံသကို မကျေမနပ်ဖဌစ်စေရန် သို့မဟုတ် ဖောင်သကာသရန် ဆုံသဖဌတ်ချက်ချခဲ့သည် (သက်ဆိုင်ရာအဆို့ရဟင်မျာသကို အဖလင့်အပိတ်) ပဌုလုပ်ခဲ့သည်။ သို့သော်၊ နေရာအာသလုံသတလင် ကန့်သတ်ချက်မရဟိဘဲ အဆို့ရဟင်မျာသ၏ အခဌေအနေမျာသကို ထိန်သချုပ်နိုင်စေသည့် Manual Control Mode ပါရဟိသည်။

ကမုဒ်ကိုဖလင့်ခဌင်သ၏ ရဟုပ်ထလေသမဟုတလင် ရပ်တည်ချက်မျာသသည် ကလဲပဌာသသည်- အကာအကလယ်မဲ့ ရပ်တည်ချက်တလင် ၎င်သကို ပဌုလုပ်ရန် အလလယ်ကူဆုံသဖဌစ်ပဌီသ လုံခဌုံရေသ မဌင့်မာသသော ရပ်တည်မဟုတလင် ၎င်သသည် တူညီစလာ ပိုမိုခက်ခဲသည်။

ပဌဿနာခဌောက်ခုအနက် ငါသခုကို နဟစ်ရက်အတလင်သ ဖဌေရဟင်သနိုင်ခဲ့သည်။ ပထမနေရာမဟ ပါဝင်သူသည် 233 မဟတ် ရရဟိခဲ့သည် (သူသည် ပဌိုင်ပလဲအတလက် ပဌင်ဆင်နေသည်မဟာ တစ်ပတ်ကဌာသည်)။ ကံထူသရဟင် သုံသညသ- ငါနေရာ - a1exdandy၊ II - Rubikoid၊ III - Ze။

သို့သော်လည်သ၊ PHDays ကာလအတလင်သ၊ ရပ်တည်ချက် သုံသခုစလုံသကို ပါဝင်သူ မည်သူမျဟ မကျော်လလဟာသနိုင်ခဲ့သောကဌောင့် အလန်လိုင်သပဌိုင်ပလဲတစ်ခု ပဌုလုပ်ပဌီသ အခက်ခဲဆုံသအလုပ်တစ်ခုကို ဇလန်လအစောပိုင်သတလင် ထုတ်ပဌန်ရန် ဆုံသဖဌတ်ခဲ့သည်။ ပါဝင်သူမျာသသည် တစ်လအတလင်သ လုပ်ငန်သတာဝန်ကို ပဌီသမဌောက်ရန်၊ အလံကိုရဟာဖလေကာ အဖဌေကို အသေသစိတ်နဟင့် စိတ်ဝင်စာသဖလယ်နည်သလမ်သဖဌင့် ဖော်ပဌရမည်ဖဌစ်သည်။

ဖဌတ်တောက်မဟုအောက်တလင် ကျလန်ုပ်တို့သည် တစ်လအတလင်သ ပေသပို့သူမျာသထံမဟ အလုပ်အတလက် အကောင်သဆုံသဖဌေရဟင်သနည်သကို ခလဲခဌမ်သစိတ်ဖဌာပဌီသ PHDays ကာလအတလင်သ ယဟဉ်ပဌိုင်မဟုတလင် ပထမနေရာရရဟိခဲ့သော Digital Security ကုမ္ပဏီမဟ Alexey Kovrizhnykh (a1exdandy) မဟ တလေ့ရဟိခဲ့သည်။ အောက်တလင် ကျလန်ုပ်တို့၏ မဟတ်ချက်မျာသနဟင့်အတူ ၎င်သ၏စာသာသကို ကျလန်ုပ်တို့တင်ပဌပါသည်။

ကနညသပိုင်သခဌာသစိတ်ဖဌာခဌင်သ။

ထို့ကဌောင့်၊ အလုပ်တလင် အောက်ပါဖိုင်မျာသပါရဟိသော မဟတ်တမ်သတစ်ခုပါရဟိသည်-

  • block_upload_traffic.pcapng
  • DB100.bin
  • အရိပ်အမဌလက်.txt

hints.txt ဖိုင်တလင် အလုပ်ဖဌေရဟင်သရန် လိုအပ်သော အချက်အလက်နဟင့် အရိပ်အမဌလက်မျာသ ပါရဟိသည်။ ကတလင် ၎င်သ၏ အကဌောင်သအရာမျာသ

  1. သင်သည် PlcSim မဟလုပ်ကလက်မျာသကို Step7 သို့တင်နိုင်သည်ဟု Petrovich ကမနေ့ကပဌောခဲ့သည်။
  2. Siemens Simatic S7-300 စီသရီသ PLC ကို မတ်တပ်ရပ်တလင် အသုံသပဌုခဲ့သည်။
  3. PlcSim သည် Siemens S7 PLCs အတလက် ပရိုဂရမ်မျာသကို လုပ်ဆောင်ရန်နဟင့် အမဟာသရဟာပဌင်ရန် ခလင့်ပဌုသည့် PLC emulator တစ်ခုဖဌစ်သည်။

DB100.bin ဖိုင်တလင် DB100 PLC ဒေတာပိတ်ဆို့ခဌင်သ- 00000000: 0100 0102 6e02 0401 0206 0100 0101 0102 ....n......... 00000010: 1002 0501 ၀၁၀၂။ ..... ......... 0202: 2002 0501 0206 0100 0102 00000020 0102 7702a0401 ..w............. 0206: 0100 0103 0102 0 02 00000030 ................ 0501: 0202 1602 0501 0206 0100 0104 0102a00000040 7502 u............... 0401: 0206 0100 0105 0102 0 02 ၀၁၀၂ ၃၄၀၂............၄။ 0501: 00000050 0202 1602 0501 0206 0100 0106 0102 ............&...... 3402: 4c00000060 0401 0206 0100 0107 0102 .......... L. 2602 : 0501 0202 00000070 4 02a0501 0206 0100 0108 ................ 0102: 3302 0401 3 00000080a 0206 0100 0109 0102 .......... ၇။ 0a02: 0501 0202b 1602 00000090 0501 0206 0100 010......" .....F... 0102b3702: 0401 0206 7c........ 000000 0 0100 .... .. 010c0102: 2202d 0501 0202a4602 0501 000000 0 0206 0100 ................ 010d0102: 3302 0401e 0206 0100d3 000000 0 ...... .... 010e0102: 0 02 0501 0202 1602 0501 0206 000000 ...........#...... 0f0100: 010 0102 6 02 0401 0206 ..... ..... 0100: 010 000000 0 0102 1102 0501 0202 2302 ......%......... 0501: 0206 0100 000000 0 0110 0102..... .....&.3502:0401 0206 0100c0111 0102 5 00000100.......L......

အမည် အကဌံပဌုထာသသည့်အတိုင်သ၊ block_upload_traffic.pcapng ဖိုင်တလင် PLC သို့ ဘလောက်အပ်လုဒ်အသလာသအလာ အမဟိုက်ပုံတစ်ပုံပါရဟိသည်။

ညီလာခံကာလအတလင်သ ပဌိုင်ဆိုင်မဟုနေရာ၌ ကအသလာသအလာအမဟိုက်ပုံသည် ရရဟိရန် အနည်သငယ်ပိုခက်ခဲကဌောင်သ သတိပဌုသင့်သည်။ ဒါကိုလုပ်ဖို့၊ TeslaSCADA2 အတလက် ပရောဂျက်ဖိုင်ထဲက script ကို နာသလည်ဖို့ လိုအပ်ပါတယ်။ RC4 ကို အသုံသပဌု၍ ကုဒ်ဝဟက်ထာသသော အမဟိုက်ပုံသည် မည်သည့်နေရာတလင် ရဟိကဌောင်သနဟင့် ၎င်သကို ကုဒ်ဝဟက်ရန် မည်သည့်သော့ကို အသုံသပဌုရမည်ကို သိရဟိနာသလည်နိုင်မည်ဖဌစ်သည်။ S7 ပရိုတိုကောကလိုင်သယင့်ကို အသုံသပဌု၍ ဆိုက်ပေါ်ရဟိ ဒေတာပိတ်ဆို့ထာသသော စလန့်ပစ်ပစ္စည်သမျာသကို ရယူနိုင်သည်။ ၎င်သအတလက် ကျလန်ုပ်သည် Snap7 ပက်ကေ့ဂျ်မဟ သရုပ်ပဌ client ကို အသုံသပဌုခဲ့သည်။

အသလာသအလာ အမဟိုက်ပုံမဟ အချက်ပဌလုပ်ဆောင်ခဌင်သ ပိတ်ဆို့ခဌင်သမျာသကို ထုတ်ယူခဌင်သ။

အမဟိုက်ပုံကဌီသ၏ အကဌောင်သအရာမျာသကို ကဌည့်ခဌင်သအာသဖဌင့် ၎င်သတလင် အချက်ပဌလုပ်ဆောင်ခဌင်သ တုံသမျာသ OB1၊ FC1၊ FC2 နဟင့် FC3 တို့ပါရဟိသည်ကို သင်နာသလည်နိုင်သည်-

Industrial Ninja ၏ခဌေရာမျာသတလင်- Positive Hack Days 9 တလင် PLC ဟက်ခ်ခံရပုံ

ကတုံသမျာသကို ဖယ်ရဟာသရမည်။ ဥပမာအာသဖဌင့်၊ ယခင်က လမ်သကဌောင်သကို pcapng ဖော်မတ်မဟ pcap သို့ ပဌောင်သလဲပဌီသ အောက်ပါ script ဖဌင့် လုပ်ဆောင်နိုင်သည်။

#!/usr/bin/env python2

import struct
from scapy.all import *

packets = rdpcap('block_upload_traffic.pcap')
s7_hdr_struct = '>BBHHHHBB'
s7_hdr_sz = struct.calcsize(s7_hdr_struct)
tpkt_cotp_sz = 7
names = iter(['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin'])
buf = ''

for packet in packets:
    if packet.getlayer(IP).src == '10.0.102.11':
        tpkt_cotp_s7 = str(packet.getlayer(TCP).payload)
        if len(tpkt_cotp_s7) < tpkt_cotp_sz + s7_hdr_sz:
            continue
        s7 = tpkt_cotp_s7[tpkt_cotp_sz:]
        s7_hdr = s7[:s7_hdr_sz]
        param_sz = struct.unpack(s7_hdr_struct, s7_hdr)[4]
        s7_param = s7[12:12+param_sz]
        s7_data = s7[12+param_sz:]
        if s7_param in ('x1ex00', 'x1ex01'):  # upload
            buf += s7_data[4:]
        elif s7_param == 'x1f':
            with open(next(names), 'wb') as f:
                f.write(buf)
            buf = ''

ရလဒ်မျာသကို ဆန်သစစ်ပဌီသပါက ၎င်သတို့သည် အမဌဲတမ်သ bytes 70 70 (pp) ဖဌင့် စတင်သည်ကို သတိပဌုမိပါလိမ့်မည်။ ယခုတလင် ၎င်သတို့အာသ ခလဲခဌမ်သစိတ်ဖဌာနည်သကို လေ့လာရန် လိုအပ်ပါသည်။ assignment အရိပ်အမဌလက်က ၎င်သအတလက် PlcSim ကို အသုံသပဌုရန် လိုအပ်ကဌောင်သ အကဌံပဌုထာသသည်။

ဘလောက်မျာသမဟ လူသာသဖတ်နိုင်သော ညလဟန်ကဌာသချက်မျာသ ရယူခဌင်သ။

ပထမညသစလာ၊ Simatic Manager ဆော့ဖ်ဝဲလ်ကို အသုံသပဌု၍ အထပ်ထပ် ညလဟန်ကဌာသချက်မျာသ (= Q 7) ဖဌင့် အတုံသမျာသစလာကို S0.0-PlcSim ပရိုဂရမ်ထည့်သလင်သပဌီသ ၎င်သတလင်ရရဟိသော PLC ကို example.plc ဖိုင်သို့ သိမ်သဆည်သခဌင်သဖဌင့် ကဌိုသပမ်သကဌပါစို့။ ဖိုင်၏အကဌောင်သအရာမျာသကိုကဌည့်ရဟုခဌင်သဖဌင့်၊ အစောပိုင်သတလင်ရဟာဖလေတလေ့ရဟိခဲ့သော လက်မဟတ် 70 70 ဖဌင့် ဒေါင်သလုဒ်လုပ်ကလက်မျာသ၏အစကို အလလယ်တကူဆုံသဖဌတ်နိုင်သည်။ ဘလောက်မျာသရဟေ့တလင်၊ ဘလောက်အရလယ်အစာသကို 4-byte အဆုံသတန်ဖိုသအဖဌစ် ရေသထာသသည်။

Industrial Ninja ၏ခဌေရာမျာသတလင်- Positive Hack Days 9 တလင် PLC ဟက်ခ်ခံရပုံ

plc ဖိုင်မျာသဖလဲ့စည်သပုံနဟင့်ပတ်သက်သည့် အချက်အလက်ကို ကျလန်ုပ်တို့လက်ခံရရဟိပဌီသနောက်၊ PLC S7 ပရိုဂရမ်မျာသကိုဖတ်ရဟုရန်အတလက် အောက်ပါလုပ်ဆောင်ချက်အစီအစဉ်သည် ပေါ်လာသည်-

  1. Simatic Manager ကိုအသုံသပဌု၍ ကျလန်ုပ်တို့သည် အမဟိုက်ပုံမဟရရဟိသော S7-PlcSim တလင် ပိတ်ဆို့ဖလဲ့စည်သပုံကို ဖန်တီသပါသည်။ ဘလောက်အရလယ်အစာသမျာသသည် တူညီရပါမည် (လုပ်ကလက်မျာသကို လိုအပ်သော ညလဟန်ကဌာသချက်အရေအတလက်ဖဌင့် ဖဌည့်သလင်သခဌင်သဖဌင့် အောင်မဌင်သည်) နဟင့် ၎င်သတို့၏ ခလဲခဌာသသတ်မဟတ်မဟုမျာသ (OB1၊ FC1၊ FC2၊ FC3)။
  2. PLC ကို ဖိုင်တစ်ခုတလင် သိမ်သဆည်သပါ။
  3. ကျလန်ုပ်တို့သည် ရလာဒ်ဖိုင်ရဟိ ဘလောက်မျာသပါရဟိသော အကဌောင်သအရာမျာသကို traffic dump မဟ ဘလောက်မျာသဖဌင့် အစာသထိုသပါသည်။ လုပ်ကလက်မျာသ၏အစကို လက်မဟတ်ဖဌင့် ဆုံသဖဌတ်သည်။
  4. ကျလန်ုပ်တို့သည် ရရဟိလာသောဖိုင်ကို S7-PlcSim တလင်တင်ပဌီသ Simatic Manager ရဟိ ပိတ်ဆို့ထာသသောအကဌောင်သအရာမျာသကို ကဌည့်ရဟုပါ။

Blocks မျာသကို ဥပမာအာသဖဌင့် အောက်ပါကုဒ်ဖဌင့် အစာသထိုသနိုင်ပါသည်။

with open('original.plc', 'rb') as f:
    plc = f.read()
blocks = []
for fname in ['OB1.bin', 'FC1.bin', 'FC2.bin', 'FC3.bin']:
    with open(fname, 'rb') as f:
        blocks.append(f.read())

i = plc.find(b'pp')
for block in blocks:
    plc = plc[:i] + block + plc[i+len(block):]
    i = plc.find(b'pp', i + 1)

with open('target.plc', 'wb') as f:
    f.write(plc)

Alexey သည် ပို၍ခက်ခဲသော်လည်သ မဟန်ကန်သောလမ်သကဌောင်သကို လျဟောက်လဟမ်သခဲ့သည်။ ပါဝင်သူမျာသသည် NetToPlcSim ပရိုဂရမ်ကို အသုံသပဌုပဌီသ PlcSim သည် ကလန်ရက်ပေါ်တလင် ဆက်သလယ်နိုင်စေရန်၊ Snap7 မဟတစ်ဆင့် PlcSim သို့ ဘလောက်မျာသကို အပ်လုဒ်လုပ်ကာ ဖလံ့ဖဌိုသတိုသတက်မဟုပတ်ဝန်သကျင်ကို အသုံသပဌု၍ PlcSim မဟ ပရောဂျက်တစ်ခုအဖဌစ် ကလုပ်ကလက်မျာသကို ဒေါင်သလုဒ်လုပ်ရန် ကျလန်ုပ်တို့ ယူဆပါသည်။

S7-PlcSim တလင် ရရဟိလာသော ဖိုင်ကိုဖလင့်ခဌင်သဖဌင့်၊ သင်သည် Simmatic Manager ကို အသုံသပဌု၍ ရေသထာသသော တုံသမျာသကို ဖတ်နိုင်သည်။ ပင်မစက်ပစ္စည်သထိန်သချုပ်မဟုလုပ်ဆောင်ချက်မျာသကို block FC1 တလင်မဟတ်တမ်သတင်ထာသသည်။ အထူသသတိပဌုရမည့်အချက်မဟာ ဖလင့်လိုက်သောအခါတလင် PLC ထိန်သချုပ်မဟုအာသ M0 နဟင့် M2.2 ဘစ်မဟတ်ဉာဏ်တန်ဖိုသမျာသပေါ်တလင် အခဌေခံ၍ PLC ထိန်သချုပ်မဟုအာသ manual mode သို့ သတ်မဟတ်ပေသသည့် #TEMP2.3 variable ဖဌစ်သည်။ #TEMP0 တန်ဖိုသကို function FC3 မဟ သတ်မဟတ်သည်။

Industrial Ninja ၏ခဌေရာမျာသတလင်- Positive Hack Days 9 တလင် PLC ဟက်ခ်ခံရပုံ

ပဌဿနာကိုဖဌေရဟင်သရန်၊ သင်သည် FC3 လုပ်ဆောင်ချက်ကို ပိုင်သခဌာသစိတ်ဖဌာပဌီသ ယုတ္တိတစ်ခုပဌန်ဖဌစ်လာစေရန် လုပ်ဆောင်ရမည့်အရာမျာသကို နာသလည်ရန် လိုအပ်သည်။

ပဌိုင်ဆိုင်မဟုဆိုက်ရဟိ Low Security stand ရဟိ PLC signal processing blocks မျာသကို အလာသတူနည်သလမ်သဖဌင့် စီစဉ်ပေသခဲ့သော်လည်သ #TEMP0 variable ၏တန်ဖိုသကို သတ်မဟတ်ရန်အတလက်၊ DB1 block တလင် ကျလန်ုပ်၏နင်ဂျာနည်သလမ်သကို DB7 ဘလော့တလင် ရေသရန် လုံလောက်ပါသည်။ block တစ်ခုရဟိ တန်ဖိုသကို စစ်ဆေသခဌင်သသည် ရိုသရဟင်သပဌီသ block programming language ၏ နက်နဲသော အသိပညာ မလိုအပ်ပါ။ ထင်ရဟာသသည်မဟာ၊ လုံခဌုံရေသအဆင့်တလင်၊ manual control ကိုရရဟိရန်မဟာ ပို၍ခက်ခဲမည်ဖဌစ်ပဌီသ STL ဘာသာစကာသ၏ ရဟုပ်ထလေသမဟုမျာသ (SXNUMX PLC ကို ပရိုဂရမ်ပဌုလုပ်ရန် နည်သလမ်သမျာသထဲမဟတစ်ခု) ကို နာသလည်ရန် လိုအပ်ပါသည်။

ပဌောင်သပဌန်ပိတ်ဆို့ FC3

STL ကိုယ်စာသပဌုမဟုတလင် FC3 ဘလောက်၏ အကဌောင်သအရာမျာသ-

      L     B#16#0
      T     #TEMP13
      T     #TEMP15
      L     P#DBX 0.0
      T     #TEMP4
      CLR   
      =     #TEMP14
M015: L     #TEMP4
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D   
      JC    M016
      L     DW#16#0
      T     #TEMP0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  
M00d: L     B [AR1,P#0.0]
      T     #TEMP5
      L     W#16#1
      ==I   
      JC    M007
      L     #TEMP5
      L     W#16#2
      ==I   
      JC    M008
      L     #TEMP5
      L     W#16#3
      ==I   
      JC    M00f
      L     #TEMP5
      L     W#16#4
      ==I   
      JC    M00e
      L     #TEMP5
      L     W#16#5
      ==I   
      JC    M011
      L     #TEMP5
      L     W#16#6
      ==I   
      JC    M012
      JU    M010
M007: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M003
      JU    M001
      JU    M002
      JU    M004
M003: JU    M005
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP0
      JU    M006
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP1
      JU    M006
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #TEMP2
      JU    M006
M00f: +AR1  P#1.0
      L     B [AR1,P#0.0]
      L     C#8
      *I    
      T     #TEMP11
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      TAR1  #TEMP4
      OPN   DB   101
      L     P#DBX 0.0
      LAR1  
      L     #TEMP11
      +AR1  
      LAR2  #TEMP9
      L     B [AR2,P#0.0]
      T     B [AR1,P#0.0]
      L     #TEMP4
      LAR1  
      JU    M006
M008: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    M005
M00b: L     #TEMP3
      T     #TEMP0
      JU    M006
M00a: L     #TEMP3
      T     #TEMP1
      JU    M006
M00c: L     #TEMP3
      T     #TEMP2
      JU    M006
M00e: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M011: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I    
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #TEMP0
      L     MB   101
      T     #TEMP1
      L     MB   102
      T     #TEMP2
      L     #TEMP4
      LAR1  
      JU    M006
M012: L     #TEMP15
      INC   1
      T     #TEMP15
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10
      TAR1  #TEMP4
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #TEMP4
      L     B#16#0
      T     #TEMP6
      JU    M006
M014: L     #TEMP4
      LAR1  
      L     #TEMP13
      L     L#1
      +I    
      T     #TEMP13
      JU    M006
M006: L     #TEMP0
      T     MB   100
      L     #TEMP1
      T     MB   101
      L     #TEMP2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    M005
M010: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #TEMP4
M005: TAR1  #TEMP4
      CLR   
      =     #TEMP16
      L     #TEMP13
      L     L#20
      ==I   
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M017
      L     #TEMP13
      L     L#20
      <I    
      S     #TEMP16
      L     #TEMP15
      ==I   
      A     #TEMP16
      JC    M018
      JU    M019
M017: SET   
      =     #TEMP14
      JU    M016
M018: CLR   
      =     #TEMP14
      JU    M016
M019: CLR   
      O     #TEMP14
      =     #RET_VAL
      JU    M015
M016: CLR   
      O     #TEMP14
      =     #RET_VAL

ကုဒ်သည် အလလန်ရဟည်လျာသပဌီသ STL နဟင့် မရင်သနဟီသသူအတလက် ရဟုပ်ထလေသပုံရသည်။ ကဆောင်သပါသ၏ဘောင်အတလင်သ ညလဟန်ကဌာသချက်တစ်ခုစီကို ခလဲခဌမ်သစိတ်ဖဌာရန် အဓိပ္ပါယ်မရဟိပါ၊ STL ဘာသာစကာသ၏ အသေသစိတ်ညလဟန်ကဌာသချက်မျာသနဟင့် လုပ်ဆောင်နိုင်စလမ်သမျာသကို သက်ဆိုင်ရာလက်စလဲစာအုပ်တလင် တလေ့ရဟိနိုင်သည်- S7-300 နဟင့် S7-400 ပရိုဂရမ်ရေသသာသခဌင်သအတလက် ထုတ်ပဌန်ချက်စာရင်သ (STL). ကနေရာတလင် ကျလန်ုပ်လုပ်ဆောင်ပဌီသနောက် တူညီသောကုဒ်ကို တင်ပဌပါမည် - အညလဟန်သမျာသနဟင့် ကိန်သရဟင်မျာသကို အမည်ပဌောင်သခဌင်သနဟင့် လုပ်ဆောင်ချက် အယ်လဂိုရီသမ်နဟင့် အချို့သော STL ဘာသာစကာသ တည်ဆောက်မဟုမျာသကို ဖော်ပဌသည့် မဟတ်ချက်မျာသ ပေါင်သထည့်ခဌင်သ။ မေသခလန်သထုတ်ထာသသော ဘလောက်တလင် DB100 ဘလောက်တလင်ရဟိသော ဘိုက်ကုဒ်အချို့ကို လုပ်ဆောင်သည့် virtual machine တစ်ခုပါရဟိသည်ကို ကျလန်ုပ်ချက်ချင်သ သတိပဌုပါ။ Virtual machine လမ်သညလဟန်ချက်မျာသတလင် လည်ပတ်ကုဒ် 1 byte နဟင့် argument မျာသ၏ bytes ၊ argument တစ်ခုစီအတလက် one byte ပါဝင်သည်။ ထည့်သလင်သစဉ်သစာသထာသသော ညလဟန်ကဌာသချက်အာသလုံသတလင် အငဌင်သအခုံနဟစ်ခုရဟိသည်၊ ကျလန်ုပ်သည် ၎င်သတို့၏တန်ဖိုသမျာသကို မဟတ်ချက်မျာသတလင် X နဟင့် Y အဖဌစ် သတ်မဟတ်ခဲ့သည်။

လုပ်ဆောင်ပဌီသနောက် ကုဒ်]

# ИМОцОалОзацОя разлОчМых переЌеММых
      L     B#16#0
      T     #CHECK_N        # СчетчОк успешМП прПйЎеММых прПверПк
      T     #COUNTER_N      # СчетчОк ПбщегП кПлОчества прПверПк
      L     P#DBX 0.0
      T     #POINTER        # Указатель Ма текущую ОМструкцОю
      CLR   
      =     #PRE_RET_VAL

# ОсМПвМПй цОкл рабПты ОМтерпретатПра байт-кПЎа
LOOP: L     #POINTER
      LAR1  
      OPN   DB   100
      L     DBLG
      TAR1  
      <=D                   # ПрПверка выхПЎа указателя за преЎелы прПграЌЌы
      JC    FINISH
      L     DW#16#0
      T     #REG0
      L     #TEMP6
      L     W#16#0
      <>I   
      JC    M00d
      L     P#DBX 0.0
      LAR1  

# КПМструкцОя switch - case Ўля ПбрабПткО разлОчМых ПпкПЎПв
M00d: L     B [AR1,P#0.0]
      T     #OPCODE
      L     W#16#1
      ==I   
      JC    OPCODE_1
      L     #OPCODE
      L     W#16#2
      ==I   
      JC    OPCODE_2
      L     #OPCODE
      L     W#16#3
      ==I   
      JC    OPCODE_3
      L     #OPCODE
      L     W#16#4
      ==I   
      JC    OPCODE_4
      L     #OPCODE
      L     W#16#5
      ==I   
      JC    OPCODE_5
      L     #OPCODE
      L     W#16#6
      ==I   
      JC    OPCODE_6
      JU    OPCODE_OTHER

# ОбрабПтчОк ПпкПЎа 01: загрузка зМачеМОя Оз DB101[X] в регОстр Y
# OP01(X, Y): REG[Y] = DB101[X]
OPCODE_1: +AR1  P#1.0
      L     P#DBX 0.0
      LAR2  
      L     B [AR1,P#0.0]   # Загрузка аргуЌеМта X (ОМЎекс в DB101)
      L     C#8
      *I    
      +AR2  
      +AR1  P#1.0
      L     B [AR1,P#0.0]   # Загрузка аргуЌеМта Y (ОМЎекс регОстра)
      JL    M003            # АМалПг switch - case Ма ПсМПве зМачеМОя Y
      JU    M001            # Ўля выбПра МеПбхПЎОЌПгП регОстра Ўля запОсО.
      JU    M002            # ППЎПбМые кПМструкцОО ОспПльзуются О в ЎругОх
      JU    M004            # ПперацОях МОже Ўля аМалПгОчМых целей
M003: JU    LOOPEND
M001: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG0           # ЗапОсь зМачеМОя DB101[X] в REG[0]
      JU    PRE_LOOPEND
M002: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG1           # ЗапОсь зМачеМОя DB101[X] в REG[1]
      JU    PRE_LOOPEND
M004: OPN   DB   101
      L     B [AR2,P#0.0]
      T     #REG2           # ЗапОсь зМачеМОя DB101[X] в REG[2]
      JU    PRE_LOOPEND

# ОбрабПтчОк ПпкПЎа 02: загрузка зМачеМОя X в регОстр Y
# OP02(X, Y): REG[Y] = X
OPCODE_2: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP3
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      JL    M009
      JU    M00b
      JU    M00a
      JU    M00c
M009: JU    LOOPEND
M00b: L     #TEMP3
      T     #REG0
      JU    PRE_LOOPEND
M00a: L     #TEMP3
      T     #REG1
      JU    PRE_LOOPEND
M00c: L     #TEMP3
      T     #REG2
      JU    PRE_LOOPEND

# ОпкПЎ 03 Ме ОспПльзуется в прПграЌЌе, пПэтПЌу прПпустОЌ егП
...

# ОбрабПтчОк ПпкПЎа 04: сравМеМОе регОстрПв X О Y
# OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
OPCODE_4: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          # первый аргуЌеМт - X
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[X]
      LAR2  #TEMP10         # REG[Y]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      AW    
      INVI  
      T     #TEMP12         # ~(REG[Y] & REG[X])
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      OW    
      L     #TEMP12
      AW                    # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - аМалПг прПверкО Ма равеМствП
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ОбрабПтчОк ПпкПЎа 05: вычОтаМОе регОстра Y Оз X
# OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
OPCODE_5: +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          # REG[X]
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9
      LAR2  #TEMP10
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      -I                    # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
      T     B [AR1,P#0.0]
      L     DW#16#0
      T     #REG0
      L     MB   101
      T     #REG1
      L     MB   102
      T     #REG2
      L     #POINTER
      LAR1  
      JU    PRE_LOOPEND

# ОбрабПтчОк ПпкПЎа 06: ОМкреЌеМт #CHECK_N прО равеМстве регОстрПв X О Y
# OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
OPCODE_6: L     #COUNTER_N
      INC   1
      T     #COUNTER_N
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP7          #  REG[X]     
      L     P#M 100.0
      LAR2  
      L     #TEMP7
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP9          #  REG[X]  
      +AR1  P#1.0
      L     B [AR1,P#0.0]
      T     #TEMP8
      L     P#M 100.0
      LAR2  
      L     #TEMP8
      L     C#8
      *I    
      +AR2  
      TAR2  #TEMP10         # REG[Y]
      TAR1  #POINTER
      LAR1  #TEMP9          # REG[Y]
      LAR2  #TEMP10         # REG[X]
      L     B [AR1,P#0.0]
      L     B [AR2,P#0.0]
      ==I   
      JCN   M013
      JU    M014
M013: L     P#DBX 0.0
      LAR1  
      T     #POINTER
      L     B#16#0
      T     #TEMP6
      JU    PRE_LOOPEND
M014: L     #POINTER
      LAR1  
# ИМкреЌеМт зМачеМОя #CHECK_N
      L     #CHECK_N
      L     L#1
      +I    
      T     #CHECK_N
      JU    PRE_LOOPEND

PRE_LOOPEND: L     #REG0
      T     MB   100
      L     #REG1
      T     MB   101
      L     #REG2
      T     MB   102
      +AR1  P#1.0
      L     #TEMP6
      +     1
      T     #TEMP6
      JU    LOOPEND

OPCODE_OTHER: L     P#DBX 0.0
      LAR1  
      L     0
      T     #TEMP6
      TAR1  #POINTER

LOOPEND: TAR1  #POINTER
      CLR   
      =     #TEMP16
      L     #CHECK_N
      L     L#20
      ==I   
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
# Все прПверкО прПйЎеМы, еслО #CHECK_N == #COUNTER_N == 20
      JC    GOOD
      L     #CHECK_N
      L     L#20
      <I    
      S     #TEMP16
      L     #COUNTER_N
      ==I   
      A     #TEMP16
      JC    FAIL
      JU    M019
GOOD: SET   
      =     #PRE_RET_VAL
      JU    FINISH
FAIL: CLR   
      =     #PRE_RET_VAL
      JU    FINISH
M019: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL
      JU    LOOP
FINISH: CLR   
      O     #PRE_RET_VAL
      =     #RET_VAL

အတုအယောင်စက် ညလဟန်ကဌာသချက်မျာသကို အကဌံဥာဏ်ရရဟိပဌီသ DB100 ဘလောက်တလင် bytecode ကိုခလဲခဌမ်သစိတ်ဖဌာရန် အသေသစာသ disassembler တစ်ခုရေသလိုက်ကဌပါစို့။

import string
alph = string.ascii_letters + string.digits

with open('DB100.bin', 'rb') as f:
    m = f.read()

pc = 0

while pc < len(m):
    op = m[pc]
    if op == 1:
        print('R{} = DB101[{}]'.format(m[pc + 2], m[pc + 1]))
        pc += 3
    elif op == 2:
        c = chr(m[pc + 1])
        c = c if c in alph else '?'
        print('R{} = {:02x} ({})'.format(m[pc + 2], m[pc + 1], c))
        pc += 3
    elif op == 4:
        print('R0 = 0; R{} = (R{} == R{})'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 5:
        print('R0 = 0; R{} = R{} - R{}'.format(
            m[pc + 1], m[pc + 1], m[pc + 2]))
        pc += 3
    elif op == 6:
        print('CHECK (R{} == R{})n'.format(
            m[pc + 1], m[pc + 2]))
        pc += 3
    else:
        print('unk opcode {}'.format(op))
        break

ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့သည် အောက်ပါ virtual machine code ကို ရရဟိသည်-

စက်ကုဒ်အတု

R1 = DB101[0]
R2 = 6e (n)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[1]
R2 = 10 (?)
R0 = 0; R1 = R1 - R2
R2 = 20 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[2]
R2 = 77 (w)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[3]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[4]
R2 = 75 (u)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[5]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[6]
R2 = 34 (4)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[7]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[8]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[9]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[10]
R2 = 37 (7)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[11]
R2 = 22 (?)
R0 = 0; R1 = R1 - R2
R2 = 46 (F)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[12]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[13]
R2 = 0a (?)
R0 = 0; R1 = R1 - R2
R2 = 16 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[14]
R2 = 6d (m)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[15]
R2 = 11 (?)
R0 = 0; R1 = R1 - R2
R2 = 23 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[16]
R2 = 35 (5)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[17]
R2 = 12 (?)
R0 = 0; R1 = R1 - R2
R2 = 25 (?)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

R1 = DB101[18]
R2 = 33 (3)
R0 = 0; R1 = (R1 == R2)
CHECK (R1 == R0)

R1 = DB101[19]
R2 = 26 (?)
R0 = 0; R1 = R1 - R2
R2 = 4c (L)
R0 = 0; R1 = R1 - R2
CHECK (R1 == R0)

သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ ကပရိုဂရမ်သည် DB101 မဟ ဇာတ်ကောင်တစ်ခုစီကို တူညီသောတန်ဖိုသတစ်ခုအထိ သာတူညီမျဟရဟိစေရန် စစ်ဆေသသည်။ စစ်ဆေသမဟုအာသလုံသကို ကျော်ဖဌတ်ရန်အတလက် နောက်ဆုံသစာကဌောင်သမဟာ n0w u 4r3 7h3 m4573r ဖဌစ်သည်။ ကလိုင်သကို block DB101 တလင်ထာသရဟိပါက၊ manual PLC ထိန်သချုပ်မဟုကို အသက်သလင်သထာသပဌီသ၊ ၎င်သသည် မီသပုံသပျံကို ပေါက်ကလဲရန် သို့မဟုတ် မကျေမနပ်ဖဌစ်နိုင်မည်ဖဌစ်သည်။‚

ဒါပါပဲ! Alexey သည် စက်မဟုနင်ဂျာနဟင့်ထိုက်တန်သော မဌင့်မာသသောအသိပညာကို သရုပ်ပဌခဲ့သည် ပါဝင်သူအာသလုံသကို ကျေသဇူသအမျာသကဌီသတင်ပါတယ်။

source: www.habr.com

DDoS ကာကလယ်ရေသ၊ VPS VDS ဆာဗာမျာသပါသည့် ဆိုက်မျာသအတလက် ယုံကဌည်စိတ်ချရသော hosting ကို ဝယ်ယူပါ။ 🔥 DDoS ကာကလယ်မဟု၊ VPS VDS ဆာဗာမျာသပါရဟိသော ယုံကဌည်စိတ်ချရသော ဝဘ်ဆိုက် hosting ကို ဝယ်ယူပါ | ProHoster