เปƒเบ™ footsteps เบ‚เบญเบ‡ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™ PLC เป„เบ”เป‰เบ–เบทเบ hacked เปƒเบ™ Positive Hack Days 9

เปƒเบ™ footsteps เบ‚เบญเบ‡ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™ PLC เป„เบ”เป‰เบ–เบทเบ hacked เปƒเบ™ Positive Hack Days 9

เปƒเบ™ PHDays เบชเบธเบ”เบ—เป‰เบฒเบ 9 เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เป€เบžเบทเปˆเบญ hack เป‚เบฎเบ‡เบ‡เบฒเบ™เบœเบฐเบฅเบดเบ”เบญเบฒเบเปเบเบฑเบช - เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ. เบกเบตเบชเบฒเบกเบขเบทเบ™เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เบตเปˆเบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ•เปˆเปเบฒ, เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบชเบนเบ‡), emulating เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒเบ”เบฝเบงเบเบฑเบ™: เบญเบฒเบเบฒเบ”เบžเบฒเบเปƒเบ•เป‰เบ„เบงเบฒเบกเบเบปเบ”เบ”เบฑเบ™เป„เบ”เป‰เบ–เบทเบ pumped เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ›เบนเบกเป€เบ›เบปเป‰เบฒ (เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เปˆเบญเบเบญเบญเบเบกเบฒ).

เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบญเบปเบ‡เบ›เบฐเบเบญเบšเบฎเบฒเบ”เปเบงเบ‚เบญเบ‡เบ‚เบฒเบ•เบฑเป‰เบ‡เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™: Siemens Simatic PLC S7-300 เบŠเบธเบ”; เบ›เบธเปˆเบก deflation เบชเบธเบเป€เบชเบตเบ™เปเบฅเบฐเบญเบธเบ›เบฐเบเบญเบ™เบงเบฑเบ”เปเบ—เบเบ„เบงเบฒเบกเบเบปเบ”เบ”เบฑเบ™ (เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš PLC เบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™เบ”เบดเบˆเบดเบ•เบญเบ™ (DI)); valves เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบญเบฑเบ”เบ•เบฒเป€เบ‡เบดเบ™เป€เบŸเบตเป‰เปเบฅเบฐ deflation เบ‚เบญเบ‡เบญเบฒเบเบฒเบ” (เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ”เบดเบˆเบดเบ•เบญเบ™เบ‚เบญเบ‡ PLC (DO)) - เป€เบšเบดเปˆเบ‡เบฎเบนเบšเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เปƒเบ™ footsteps เบ‚เบญเบ‡ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™ PLC เป„เบ”เป‰เบ–เบทเบ hacked เปƒเบ™ Positive Hack Days 9

PLC, เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบญเปˆเบฒเบ™เบ„เบงเบฒเบกเบเบปเบ”เบ”เบฑเบ™เปเบฅเบฐเบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบ™, เป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐ deflate เบซเบผเบท inflate เบšเบฒเบ™ (เป€เบ›เบตเบ”เปเบฅเบฐเบ›เบดเบ”เบ›เปˆเบฝเบ‡เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™). เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เบฒเบ•เบฑเป‰เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ„เบนเปˆเบกเบท, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ„เบงเบšเบ„เบธเบกเบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบ›เปˆเบฝเบ‡เป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เปƒเบ”เป†.

เบ‚เบฒเบ•เบฑเป‰เบ‡เบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เปƒเบ™เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบ™เบตเป‰: เบขเบนเปˆเบ—เบตเปˆเบˆเบธเบ”เบขเบทเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰, เปเบฅเบฐเบขเบนเปˆเบ—เบตเปˆเบˆเบธเบ”เบขเบทเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบชเบนเบ‡เบกเบฑเบ™เบเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบ.

เบซเป‰เบฒโ€‹เปƒเบ™โ€‹เบซเบปเบโ€‹เบšเบฑเบ™เบซเบฒโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เปƒเบ™โ€‹เบชเบญเบ‡โ€‹เบกเบทเป‰; เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เปเบฒเบญเบดเบ”เป„เบ”เป‰เบฎเบฑเบš 233 เบ„เบฐเปเบ™เบ™ (เบฅเบฒเบงเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบ™เบถเปˆเบ‡เบญเบฒเบ—เบดเบ”เปƒเบ™เบเบฒเบ™เบเบฐเบเบฝเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™). เบชเบฒเบกเบœเบนเป‰เบŠเบฐเบ™เบฐ: I place - a1exdandy, II - Rubikoid, III - Ze.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ PHDays, เบšเปเปˆเบกเบตเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบŠเบฐเบ™เบฐเบ—เบฑเบ‡เบชเบฒเบกเบˆเบธเบ”เบขเบทเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบฎเบฑเบ”เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เบญเบญเบ™เป„เบฅเบ™เปŒเปเบฅเบฐเป€เบœเบตเบเปเบœเปˆเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบเบฒเบเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบ•เบปเป‰เบ™เป€เบ”เบทเบญเบ™เบกเบดเบ–เบธเบ™เบฒ. เบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡เป€เบ”เบทเบญเบ™, เบŠเบญเบเบซเบฒเบ—เบธเบ‡, เปเบฅเบฐเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เปเบเป‰เป„เบ‚เบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เปเบฅเบฐเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ.

เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบเบฒเบ™เบ•เบฑเบ”เบžเบงเบเป€เบฎเบปเบฒเป€เบœเบตเบเปเบœเปˆเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบˆเบฒเบเบœเบนเป‰เบ—เบตเปˆเบชเบปเปˆเบ‡เบกเบฒเปƒเบ™เป€เบ”เบทเบญเบ™, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™เป‚เบ”เบ Alexey Kovrizhnykh (a1exdandy) เบˆเบฒเบเบšเปเบฅเบดเบชเบฑเบ” Digital Security, เบœเบนเป‰เบ—เบตเปˆเป„เบ”เป‰เบญเบฑเบ™เบ”เบฑเบšเบ—เบต XNUMX เปƒเบ™เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ PHDays. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เบกเบฑเบ™เบ”เป‰เบงเบเบ„เปเบฒเป€เบซเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบฝเบเบ‡เบฒเบ™เบกเบตเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบตเปˆเบกเบตเป„เบŸเบฅเปŒเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • block_upload_traffic.pcapng
  • DB100.bin
  • hints.txt

เป„เบŸเบฅเปŒ hints.txt เบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™ เปเบฅเบฐเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบงเบฝเบเบ‡เบฒเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบกเบฑเบ™:

  1. Petrovich เบšเบญเบเบ‚เป‰เบญเบเปƒเบ™เบกเบทเป‰เบงเบฒเบ™เบ™เบตเป‰เบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบซเบฅเบ”เบšเบฅเบฑเบญเบเบˆเบฒเบ PlcSim เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 7.
  2. Siemens Simatic S7-300 series PLC เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเบนเปˆเบšเปˆเบญเบ™เบ•เบฑเป‰เบ‡.
  3. PlcSim เป€เบ›เบฑเบ™ emulator PLC เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปเบฅเบฐ debug เป‚เบ„เบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบš Siemens S7 PLCs.

เป„เบŸเบฅเปŒ 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 7702 0401a0206 ..w............. 0100: 0103 0102 0 02 00000030 0501 ................ 0202: 1602 0501 0206 0100 0104 0102 00000040a7502 0401 u............... 0206: 0100 0105 0102 0 02 0501 00000050 0202............1602. 0501: 0206 0100 0106 0102 3402 4 00000060 0401 0206 0100 0107 0102 2602 0501 0202 00000070 4 02 0501 : 0206 0100 0108 0102 3302a0401 3 00000080 0206 ................ 0100 : 0109 0102 0 02a 0501 0202 1602 00000090 ..... . .. 0501c0206:0100d 010 0102a3702 0401 0206 7 000000 0 ................ 0100d010: 0102 2202e 0501 0202d4602 0501 000000 ...... .... 0e0206: 0100 010 0102 3302 0401 0206 0100 3 ........#...... 000000f0: 010 0102 0 02 0501 0202 ..... ..... 1602: 0501 0206 000000 0 0100 010 0102 6......%......... 02: 0401 0206 0100 010 000000 0 ..... ....&. 0102: 1102 0501 0202c2302 0501 0206 0100 ....L......

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบŠเบทเปˆเปเบ™เบฐเบ™เปเบฒ, เป„เบŸเบฅเปŒ block_upload_traffic.pcapng เบกเบตเบเบฒเบ™เบ–เบดเป‰เบกเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบ‚เบญเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ”เบšเบฅเบฑเบญเบเป„เบ›เบซเบฒ PLC.

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบเบฒเบ™เบ–เบดเป‰เบกเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเปเบ‚เปˆเบ‡เบ‚เบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบกเบฒ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบˆ script เบˆเบฒเบเป„เบŸเบฅเปŒเป‚เบ„เบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบš TeslaSCADA2. เบˆเบฒเบเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰เบงเปˆเบฒเบšเปˆเบญเบ™เบ–เบดเป‰เบกเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰ RC4 เบ•เบฑเป‰เบ‡เบขเบนเปˆเปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เปƒเบ”เป€เบžเบทเปˆเบญเบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบกเบฑเบ™. เบเบฒเบ™เบ–เบดเป‰เบกเบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเปƒเบŠเป‰ S7 protocol client. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบฅเบนเบเบ„เป‰เบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเบŠเบธเบ” Snap7.

เบชเบฐเบเบฑเบ”เบ•เบฑเบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเบฑเบ™เบเบฒเบ™เบˆเบฒเบ dump เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™

เบŠเบญเบเบซเบฒเบขเบนเปˆเปƒเบ™เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡ dump, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰เบงเปˆเบฒเบกเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ•เบฑเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเบฑเบ™เบเบฒเบ™ OB1, FC1, FC2 เปเบฅเบฐ FC3:

เปƒเบ™ footsteps เบ‚เบญเบ‡ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™ PLC เป„เบ”เป‰เบ–เบทเบ hacked เปƒเบ™ Positive Hack Days 9

เบ•เบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ•เป‰เบญเบ‡เบ–เบทเบเป‚เบเบเบเป‰เบฒเบ. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ”เป‰เบงเบเบชเบฐเบ„เบดเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰, เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เป„เบ”เป‰เบ›เปˆเบฝเบ™เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบˆเบฒเบเบฎเบนเบšเปเบšเบš pcapng เป€เบ›เบฑเบ™ pcap:

#!/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). เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบžเบงเบเบกเบฑเบ™. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเปเบ™เบฐเบ™เปเบฒเบงเปˆเบฒเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ PlcSim เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰.

เป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบกเบฐเบ™เบธเบ”เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบˆเบฒเบเบšเบฅเบฑเบญเบ

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก S7-PlcSim เป‚เบ”เบเบเบฒเบ™เป‚เบซเบฅเบ”เบซเบผเบฒเบเป†เบšเบฅเบฑเบญเบเบ”เป‰เบงเบเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบŠเป‰เปเบฒ (= Q 0.0) เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบŠเบญเบšเปเบง Simatic Manager, เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบ PLC เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™ emulator เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒ example.plc. เป‚เบ”เบเบเบฒเบ™เป€เบšเบดเปˆเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เป„เบŸเบฅเปŒ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ—เบตเปˆเบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบ”เป‰เบ‡เปˆเบฒเบเป‚เบ”เบเบฅเบฒเบเป€เบŠเบฑเบ™ 70 70, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ„เบปเป‰เบ™เบžเบปเบšเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰. เบเปˆเบญเบ™เบ—เปˆเบญเบ™เป„เบกเป‰, เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเปเบกเปˆเบ™เบ‚เบฝเบ™เป€เบ›เบฑเบ™เบ„เปˆเบฒ 4-byte เบ™เป‰เบญเบ-endian.

เปƒเบ™ footsteps เบ‚เบญเบ‡ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™ PLC เป„เบ”เป‰เบ–เบทเบ hacked เปƒเบ™ Positive Hack Days 9

เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เป„เบŸเบฅเปŒ plc, เปเบœเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™ PLC S7:

  1. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Simatic Manager, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบเปƒเบ™ S7-PlcSim เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเบเบฒเบ™เบ–เบดเป‰เบกเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญ. เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฑเบ™เบ•เป‰เบญเบ‡เบเบปเบ‡เบเบฑเบ™ (เบญเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบ•เบฑเบ™เบ”เป‰เบงเบเบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™) เปเบฅเบฐเบ•เบปเบงเบฅเบฐเบšเบธเบ‚เบญเบ‡เบกเบฑเบ™ (OB1, FC1, FC2, FC3).
  2. เบšเบฑเบ™เบ—เบถเบ PLC เปƒเบชเปˆเป„เบŸเบฅเปŒ.
  3. เบžเบงเบเป€เบฎเบปเบฒเบ—เบปเบ”เปเบ—เบ™เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบ•เบฑเบ™เปƒเบ™เป„เบŸเบฅเปŒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฑเบšเบ•เบฑเบ™เบˆเบฒเบ dump เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™. เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ—เปˆเบญเบ™เป„เบกเป‰เปเบกเปˆเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบฅเบฒเบเป€เบŠเบฑเบ™.
  4. เบžเบงเบเป€เบฎเบปเบฒเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ S7-PlcSim เปเบฅเบฐเป€เบšเบดเปˆเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบ•เบฑเบ™เปƒเบ™ Simmatic 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 เบชเบฒเบกเบฒเบ”เบชเบทเปˆเบชเบฒเบ™เบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบญเบฑเบšเป‚เบซเบฅเบ”เบšเบฅเบฑเบญเบเป„เบ›เบเบฑเบ‡ PlcSim เบœเปˆเบฒเบ™ Snap7, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เบฒเบงเป‚เบซเบฅเบ”เบ•เบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฒเบ PlcSim เป‚เบ”เบเปƒเบŠเป‰เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เป‚เบ”เบเบเบฒเบ™เป€เบ›เบตเบ”เป„เบŸเบฅเปŒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™ S7-PlcSim, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบšเบฅเบฑเบญเบเบ—เบตเปˆเบ–เบทเบเบ‚เบฝเบ™เบ—เบฑเบšเป‚เบ”เบเปƒเบŠเป‰ Simatic Manager. เบซเบ™เป‰เบฒเบ—เบตเปˆเบ„เบงเบšเบ„เบธเบกเบญเบธเบ›เบฐเบเบญเบ™เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบšเบฅเบฑเบญเบ FC1. เบซเบกเบฒเบเป€เบซเบ”เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบ•เบปเบงเปเบ› #TEMP0, เป€เบŠเบดเปˆเบ‡เป€เบกเบทเปˆเบญเป€เบ›เบตเบ”เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบˆเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบก PLC เป€เบ›เบฑเบ™เป‚เบซเบกเบ”เบ„เบนเปˆเบกเบทเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เปˆเบฒเบ„เบงเบฒเบกเบˆเปเบฒเบšเบดเบ” M2.2 เปเบฅเบฐ M2.3. เบ„เปˆเบฒ #TEMP0 เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบŸเบฑเบ‡เบŠเบฑเบ™ FC3.

เปƒเบ™ footsteps เบ‚เบญเบ‡ Ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™ PLC เป„เบ”เป‰เบ–เบทเบ hacked เปƒเบ™ Positive Hack Days 9

เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบŸเบฑเบ‡เบŠเบฑเบ™ FC3 เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เบกเบฒเบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™.

เบ•เบฑเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบชเบฑเบ™เบเบฒเบ™ PLC เบขเบนเปˆเบ—เบตเปˆเบˆเบธเบ”เบขเบทเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ•เปˆเปเบฒเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเปเบ‚เปˆเบ‡เบ‚เบฑเบ™เป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบฅเบฝเบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™, เปเบ•เปˆเป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเปเบ› #TEMP0, เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เป€เบชเบฑเป‰เบ™เบงเบดเบ—เบตเบเบฒเบ™ ninja เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ DB1 block. เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบกเบนเบ™เบ„เปˆเบฒเปƒเบ™เบšเบฅเบฑเบญเบเปเบกเปˆเบ™เบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒเปเบฅเบฐเบšเปเปˆเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเบฎเบนเป‰เป€เบฅเบดเบเป€เบŠเบดเปˆเบ‡เบเปˆเบฝเบงเบเบฑเบšเบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบšเบฅเบฑเบญเบ. เปเบ™เปˆเบ™เบญเบ™, เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบชเบนเบ‡, เบเบฒเบ™เบšเบฑเบ™เบฅเบธเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ„เบนเปˆเบกเบทเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเปเบฅเบฐเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ„เบงเบฒเบกเบŠเบฑเบšเบŠเป‰เบญเบ™เบ‚เบญเบ‡เบžเบฒเบชเบฒ STL (เบซเบ™เบถเปˆเบ‡เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ„เบ‡เบเบฒเบ™ S7 PLC).

Reverse block FC3

เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบ•เบฑเบ™ FC3 เปƒเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡ STL:

      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 เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เบ„เบนเปˆเบกเบทเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™: เบฅเบฒเบเบเบฒเบ™เบ–เบฐเปเบซเบผเบ‡เบเบฒเบ™ (STL) เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ„เบ‡เบเบฒเบ™ S7-300 เปเบฅเบฐ S7-400. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบฅเบฐเบซเบฑเบ”เบ”เบฝเบงเบเบฑเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡ - เบเบฒเบ™เบ›เปˆเบฝเบ™เบŠเบทเปˆเบ›เป‰เบฒเบเบŠเบทเปˆเปเบฅเบฐเบ•เบปเบงเปเบ›เปเบฅเบฐเป€เบžเบตเปˆเบกเบ„เปเบฒเบ„เบดเบ”เบ„เปเบฒเป€เบซเบฑเบ™เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เปเบฅเบฐเบšเบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบžเบฒเบชเบฒ STL. เปƒเบซเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบ—เบฑเบ™เบ—เบตเบงเปˆเบฒเบ•เบฑเบ™เปƒเบ™เบ„เปเบฒเบ–เบฒเบกเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡ virtual เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฒเบ‡ bytecode เบ—เบตเปˆเบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบ•เบฑเบ™ DB100, เป€เบ™เบทเป‰เบญเปƒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡ virtual เบ›เบฐเบเบญเบšเบ”เป‰เบงเบ 1 byte เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปเบฅเบฐ bytes เบ‚เบญเบ‡ arguments, เบซเบ™เบถเปˆเบ‡ byte เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ argument. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเบชเบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡;

เบฅเบฐเบซเบฑเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™]

# ะ˜ะฝะธั†ะธะฐะปะธะทะฐั†ะธั ั€ะฐะทะปะธั‡ะฝั‹ั… ะฟะตั€ะตะผะตะฝะฝั‹ั…
      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

เบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡ virtual machine, เปƒเบซเป‰เบ‚เบฝเบ™ disassembler เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเป€เบžเบทเปˆเบญเบงเบดเป€เบ„เบฒเบฐ bytecode เปƒเบ™ DB100 block:

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 เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบฅเบฐเบซเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡ virtual

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. เบ–เป‰เบฒเป€เบชเบฑเป‰เบ™เบ™เบตเป‰เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™เบšเบฅเบฑเบญเบ DB101, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ„เบงเบšเบ„เบธเบก PLC เบ„เบนเปˆเบกเบทเบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เปเบฅเบฐเบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบฅเบฐเป€เบšเบตเบ”เบซเบผเบท deflate เบ›เบนเบกเป€เบ›เบปเป‰เบฒ.โ€จ

เบซเบกเบปเบ”โ€‹เป€เบ—เบปเปˆเบฒโ€‹เบ™เบตเป‰! Alexey เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ„เบงเบฒเบกเบฎเบนเป‰เปƒเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบ—เบตเปˆเบชเบปเบกเบ„เบงเบ™เบเบฑเบš ninja เบญเบธเบ”เบชเบฒเบซเบฐเบเปเบฒ :) เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเบปเปˆเบ‡เบฅเบฒเบ‡เบงเบฑเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบˆเบปเบ”เบˆเปเบฒเปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เบŠเบฐเบ™เบฐ. เบ‚เบญเบšเปƒเบˆเบซเบผเบฒเบเป†เบเบฑเบšเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบฑเบ‡เบซเบกเบปเบ”!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster