По ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π½Π° Industrial Ninja: ΠΊΠ°ΠΊ PLC бСшС Ρ…Π°ΠΊΠ½Π°Ρ‚ Π½Π° Positive Hack Days 9

По ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π½Π° Industrial Ninja: ΠΊΠ°ΠΊ PLC бСшС Ρ…Π°ΠΊΠ½Π°Ρ‚ Π½Π° Positive Hack Days 9

На послСдния PHDays 9 ΠΏΡ€ΠΎΠ²Π΅Π΄ΠΎΡ…ΠΌΠ΅ ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅ Π·Π° Ρ…Π°ΠΊΠ²Π°Π½Π΅ Π½Π° Π³Π°Π·ΠΎΠ²Π° ΠΏΠΎΠΌΠΏΠ° - ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅ Π˜Π½Π΄ΡƒΡΡ‚Ρ€ΠΈΠ°Π»Π΅Π½ Π½ΠΈΠ½Π΄ΠΆΠ°. На ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ°Ρ‚Π° имашС Ρ‚Ρ€ΠΈ Ρ‰Π°Π½Π΄Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° сигурност (Π‘Π΅Π· сигурност, Ниска сигурност, Висока сигурност), Π΅ΠΌΡƒΠ»ΠΈΡ€Π°Ρ‰ΠΈ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ ΠΏΡ€ΠΎΠΌΠΈΡˆΠ»Π΅Π½ процСс: Π²ΡŠΠ·Π΄ΡƒΡ… ΠΏΠΎΠ΄ наляганС сС нагнСтява Π² Π±Π°Π»ΠΎΠ½ (ΠΈ слСд Ρ‚ΠΎΠ²Π° сС освобоТдава).

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° бСзопасност, хардуСрният ΡΡŠΡΡ‚Π°Π² Π½Π° Ρ‰Π°Π½Π΄ΠΎΠ²Π΅Ρ‚Π΅ бСшС Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰: Siemens Simatic PLC сСрия S7-300; Π±ΡƒΡ‚ΠΎΠ½ Π·Π° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ изпусканС Π½Π° Π²ΡŠΠ·Π΄ΡƒΡ… ΠΈ устройство Π·Π° ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Π½Π΅ Π½Π° наляганСто (ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ към Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΈ Π²Ρ…ΠΎΠ΄ΠΎΠ²Π΅ Π½Π° PLC (DI)); ΠΊΠ»Π°ΠΏΠ°Π½ΠΈ, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ Π·Π° Π½Π°Π΄ΡƒΠ²Π°Π½Π΅ ΠΈ изпусканС Π½Π° Π²ΡŠΠ·Π΄ΡƒΡ… (ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ към Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΈΡ‚Π΅ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ Π½Π° PLC (DO)) - Π²ΠΈΠΆΡ‚Π΅ Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

По ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π½Π° Industrial Ninja: ΠΊΠ°ΠΊ PLC бСшС Ρ…Π°ΠΊΠ½Π°Ρ‚ Π½Π° Positive Hack Days 9

PLC, Π² зависимост ΠΎΡ‚ показанията Π½Π° наляганСто ΠΈ Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ със своята ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Π²Π·Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄Π° изпуснС ΠΈΠ»ΠΈ Π½Π°Π΄ΡƒΠ΅ Ρ‚ΠΎΠΏΠΊΠ°Ρ‚Π° (отваря ΠΈ затваря ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΊΠ»Π°ΠΏΠ°Π½ΠΈ). Всички стСндовС ΠΎΠ±Π°Ρ‡Π΅ ΠΈΠΌΠ°Ρ…Π° Ρ€ΡŠΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ позволявашС Π΄Π° сС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Ρ‚ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΡΡ‚Π° Π½Π° ΠΊΠ»Π°ΠΏΠ°Π½ΠΈΡ‚Π΅ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ограничСния.

Π‘Ρ‚ΠΎΠΉΠΊΠΈΡ‚Π΅ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π°Ρ…Π° ΠΏΠΎ слоТността Π½Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅ΠΆΠΈΠΌ: Π½Π° Π½Π΅Π·Π°Ρ‰ΠΈΡ‚Π΅Π½Π°Ρ‚Π° стойка бСшС Π½Π°ΠΉ-лСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ²Π°, Π° Π½Π° стойката с висока сигурност бСшС ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ.

ΠŸΠ΅Ρ‚ ΠΎΡ‚ ΡˆΠ΅ΡΡ‚Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° бяха Ρ€Π΅ΡˆΠ΅Π½ΠΈ Π·Π° Π΄Π²Π° Π΄Π½ΠΈ; ΠšΠ»Π°ΡΠΈΡ€Π°Π½ΠΈΡΡ‚ Π½Π° ΠΏΡŠΡ€Π²ΠΎ място участник спСчСли 233 Ρ‚ΠΎΡ‡ΠΊΠΈ (ΠΏΡ€Π΅ΠΊΠ°Ρ€Π° Π΅Π΄Π½Π° сСдмица Π² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π·Π° ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅Ρ‚ΠΎ). Π’Ρ€ΠΈΠΌΠ° ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΠΈ: I място - a1exdandy, II - Rubicoid, III - Ze.

По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° PHDays ΠΎΠ±Π°Ρ‡Π΅ Π½ΠΈΠΊΠΎΠΉ ΠΎΡ‚ участницитС Π½Π΅ успя Π΄Π° ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π΅ ΠΈ Ρ‚Ρ€ΠΈΡ‚Π΅ стойки, Π·Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΎΠ½Π»Π°ΠΉΠ½ ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ…ΠΌΠ΅ Π½Π°ΠΉ-Ρ‚Ρ€ΡƒΠ΄Π½Π°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° юни. УчастницитС Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΡ‚ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π΅Π΄ΠΈΠ½ мСсСц, Π΄Π° намСрят Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° ΠΎΠΏΠΈΡˆΠ°Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΠΎ интСрСсСн Π½Π°Ρ‡ΠΈΠ½.

По-Π΄ΠΎΠ»Ρƒ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΎΡ‚ ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π· мСсСца, Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΎ ΠΎΡ‚ АлСксСй ΠšΠΎΠ²Ρ€ΠΈΠΆΠ½Ρ‹Ρ… (a1exdandy) ΠΎΡ‚ компанията Digital Security, ΠΊΠΎΠΉΡ‚ΠΎ Π·Π°Π΅ XNUMX-Π²ΠΎ място Π² ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° PHDays. По-Π΄ΠΎΠ»Ρƒ прСдставямС нСговия тСкст с Π½Π°ΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ.

ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·

И Ρ‚Π°ΠΊΠ°, Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°ΡˆΠ΅ Π°Ρ€Ρ…ΠΈΠ² със слСднитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅:

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

Π€Π°ΠΉΠ»ΡŠΡ‚ hints.txt ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° информация ΠΈ подсказки Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°. Π•Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ:

  1. Π’Ρ‡Π΅Ρ€Π° ΠŸΠ΅Ρ‚Ρ€ΠΎΠ²ΠΈΡ‡ ΠΌΠΈ ΠΊΠ°Π·Π°, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Ρ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ PlcSim Π² Step7.
  2. На Ρ‰Π°Π½Π΄Π° бСшС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ PLC Π½Π° Siemens Simatic S7-300.
  3. PlcSim Π΅ PLC Π΅ΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° стартиратС ΠΈ отстраняватС Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π·Π° Siemens S7 PLC.

Π€Π°ΠΉΠ»ΡŠΡ‚ 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: 0401 0206 0100 0103 0102 0 02 00000030a0501 ..w............. 0202: 1602 0501 0206 0100 0104 0102 00000040 7502 ................ 0401: 0206 0100 0105 0102 0 02 0501a00000050 0202 u............... 1602: 0501 0206 0100 0106 0102 3402 4 00000060............0401. 0206: 0100 0107 0102 2602 0501 0202 00000070 4 .........&..... 02: 0501c0206 0100 0108 0102 3302 0401 3 00000080 L.........0206. .. 0100 : 0109 0102 0 02 0501a0202 1602 00000090 0501 ................ 0206: 0100 010 0102 3702a 0401 0206 7 000000 .........0. .... 0100a010: 0102 2202b 0501 0202 4602 0501 000000 0 ......".....F... 0206b0100: 010 0102 3302c 0401 0206 0100 3 000000 ........0. .... .. 010c0102: 0d 02 0501a0202 1602 0501 0206 000000 0 ................ 0100d010: 0102 6e 02 0401d0206 0100 010 000000 0f ......m. .... .... 0102e1102: 0501 0202 2302 0501 0206 0100 000000 0 ........#...... 0110f0102: 3502 0401 0206 0100 0111 0102 5 00000100 ....1202. ..... ..... 0501: 0202 2502 0501 0206 0100 0112 00000110 0102 ......%......... 3302: 0401 0206 0100 0113 0102 2602 3 00000120 ..0501. ..... .....&. 0202: 4 02 0501c0206 0100 XNUMX XNUMX ....L......

ΠšΠ°ΠΊΡ‚ΠΎ подсказва ΠΈΠΌΠ΅Ρ‚ΠΎ, Ρ„Π°ΠΉΠ»ΡŠΡ‚ block_upload_traffic.pcapng ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° дъмп Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π·Π° ΠΊΠ°Ρ‡Π²Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ към PLC.

Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° мястото Π½Π° ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° конфСрСнцията бСшС ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π΅Π½ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, бСшС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ скрипта ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π·Π° TeslaSCADA2. ΠžΡ‚ Π½Π΅Π³ΠΎ бСшС възмоТно Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅ къдС сС Π½Π°ΠΌΠΈΡ€Π° Π΄ΡŠΠΌΠΏΡŠΡ‚, ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° RC4, ΠΈ какъв ΠΊΠ»ΡŽΡ‡ трябва Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ. Π˜Π·Ρ…Π²ΡŠΡ€Π»ΡΠ½ΠΈΡ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ Π½Π° място ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° S7. Π—Π° Ρ†Π΅Π»Ρ‚Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… Π΄Π΅ΠΌΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Snap7.

Π˜Π·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° сигнала ΠΎΡ‚ дъмп Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° дъмпа, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ Ρ‚ΠΎΠΉ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° сигнали OB1, FC1, FC2 ΠΈ FC3:

По ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π½Π° Industrial Ninja: ΠΊΠ°ΠΊ PLC бСшС Ρ…Π°ΠΊΠ½Π°Ρ‚ Π½Π° 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 = ''

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅, Ρ‰Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅, Ρ‡Π΅ Ρ‚Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‚ с Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ 70 70 (pp). Π‘Π΅Π³Π° трябва Π΄Π° сС Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅. ΠŸΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°Ρ‚Π° Π·Π° присвояванС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°, Ρ‡Π΅ трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ PlcSim Π·Π° Ρ‚ΠΎΠ²Π°.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° лСсни Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ инструкции ΠΎΡ‚ Π±Π»ΠΎΠΊΠΎΠ²Π΅

ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ΠΊΠ° сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ S7-PlcSim, ΠΊΠ°Ρ‚ΠΎ Π·Π°Ρ€Π΅Π΄ΠΈΠΌ няколко Π±Π»ΠΎΠΊΠ° с повтарящи сС инструкции (= Q 0.0) Π² Π½Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° софтуСра Simatic Manager ΠΈ Π·Π°ΠΏΠ°Π·ΠΈΠΌ PLC, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π² Π΅ΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€Π°, във Ρ„Π°ΠΉΠ»Π° example.plc. Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ лСсно Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΏΠΎ сигнатурата 70 70, която ΠΎΡ‚ΠΊΡ€ΠΈΡ…ΠΌΠ΅ ΠΏΠΎ-Ρ€Π°Π½ΠΎ. ΠŸΡ€Π΅Π΄ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Π±Π»ΠΎΠΊΠ° Π΅ написан ΠΊΠ°Ρ‚ΠΎ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Π° стойност ΠΎΡ‚ малкия ΠΊΡ€Π°ΠΉ.

По ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π½Π° Industrial Ninja: ΠΊΠ°ΠΊ PLC бСшС Ρ…Π°ΠΊΠ½Π°Ρ‚ Π½Π° Positive Hack Days 9

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ информация Π·Π° структурата Π½Π° plc Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅, сС появи слСдният ΠΏΠ»Π°Π½ Π·Π° дСйствиС Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° PLC S7 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ:

  1. Използвайки Simatic Manager, създавамС Π±Π»ΠΎΠΊΠΎΠ²Π° структура Π² S7-PlcSim, ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° Ρ‚Π°Π·ΠΈ, която ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΠΎΡ‚ дъмпа. Π Π°Π·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ трябва Π΄Π° ΡΡŠΠ²ΠΏΠ°Π΄Π°Ρ‚ (Ρ‚ΠΎΠ²Π° сС постига Ρ‡Ρ€Π΅Π· попълванС Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ с нСобходимия Π±Ρ€ΠΎΠΉ инструкции) ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ (OB1, FC1, FC2, FC3).
  2. Π—Π°ΠΏΠ°Π·Π΅Ρ‚Π΅ PLC във Ρ„Π°ΠΉΠ».
  3. ЗамСнямС ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ Π² получСния Ρ„Π°ΠΉΠ» с Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ ΠΎΡ‚ дъмпа Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Началото Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ сС опрСдСля ΠΎΡ‚ подписа.
  4. Π—Π°Ρ€Π΅ΠΆΠ΄Π°ΠΌΠ΅ получСния Ρ„Π°ΠΉΠ» Π² S7-PlcSim ΠΈ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ Π² Simatic Manager.

Π‘Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ със слСдния ΠΊΠΎΠ΄:

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)

АлСксСй ΠΏΠΎΠ΅ ΠΏΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π΅Π½, Π½ΠΎ всС ΠΏΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ ΠΏΡŠΡ‚. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ…ΠΌΠ΅, Ρ‡Π΅ участницитС Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° NetToPlcSim, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ PlcSim Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠΈΡ€Π° ΠΏΠΎ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°, Π΄Π° ΠΊΠ°Ρ‡Π²Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π² PlcSim Ρ‡Ρ€Π΅Π· Snap7 ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° изтСгля Ρ‚Π΅Π·ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ PlcSim, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ срСдата Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

ΠšΠ°Ρ‚ΠΎ ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ получСния Ρ„Π°ΠΉΠ» Π² S7-PlcSim, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ прСзаписанитС Π±Π»ΠΎΠΊΠΎΠ²Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Simatic Manager. ΠžΡΠ½ΠΎΠ²Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° устройството са записани Π² Π±Π»ΠΎΠΊ FC1. ОсобСно Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ заслуТава ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° #TEMP0, която, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° настройва ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° PLC Π² Ρ€ΡŠΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ въз основа Π½Π° стойноститС Π½Π° Π±ΠΈΡ‚ΠΎΠ²Π°Ρ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚ M2.2 ΠΈ M2.3. Бтойността #TEMP0 сС Π·Π°Π΄Π°Π²Π° ΠΎΡ‚ функция FC3.

По ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π½Π° Industrial Ninja: ΠΊΠ°ΠΊ PLC бСшС Ρ…Π°ΠΊΠ½Π°Ρ‚ Π½Π° Positive Hack Days 9

Π—Π° Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, трябва Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ функцията FC3 ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ трябва Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π΄Π° Π²ΡŠΡ€Π½Π΅ логичСска Π΅Π΄ΠΈΠ½ΠΈΡ†Π°.

Π‘Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° сигнала Π½Π° PLC Π½Π° Ρ‰Π°Π½Π΄Π° с ниска сигурност Π½Π° мястото Π½Π° ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΠ΅Ρ‚ΠΎ бяха ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½, Π½ΠΎ Π·Π° Π΄Π° сС Π·Π°Π΄Π°Π΄Π΅ стойността Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° #TEMP0, бСшС Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΄Π° сС напишС линията ΠΏΠΎ моя Π½ΠΈΠ½Π΄ΠΆΠ° Π½Π°Ρ‡ΠΈΠ½ Π² Π±Π»ΠΎΠΊΠ° DB1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π½Π° стойността Π² Π±Π»ΠΎΠΊ бСшС лСсна ΠΈ Π½Π΅ изисквашС Π·Π°Π΄ΡŠΠ»Π±ΠΎΡ‡Π΅Π½ΠΈ познания Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π΅, Ρ‡Π΅ Π½Π° Π½ΠΈΠ²ΠΎ High Security постиганСто Π½Π° Ρ€ΡŠΡ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‰Π΅ бъдС ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π°Ρ‚ Ρ‚ΡŠΠ½ΠΊΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Π΅Π·ΠΈΠΊΠ° STL (Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° S7 PLC).

ΠžΠ±Ρ€Π°Ρ‚Π΅Π½ Π±Π»ΠΎΠΊ 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 Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ конструкции. НСка Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠ°, Ρ‡Π΅ Π²ΡŠΠΏΡ€ΠΎΡΠ½ΠΈΡΡ‚ Π±Π»ΠΎΠΊ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, която изпълнява някакъв Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄, Π½Π°ΠΌΠΈΡ€Π°Ρ‰ сС Π² Π±Π»ΠΎΠΊΠ° DB100, Ρ‡ΠΈΠ΅Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ Π·Π½Π°Π΅ΠΌ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина сС ΡΡŠΡΡ‚ΠΎΡΡ‚ ΠΎΡ‚ 1 Π±Π°ΠΉΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ ΠΊΠΎΠ΄ ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ, ΠΏΠΎ Π΅Π΄ΠΈΠ½ Π±Π°ΠΉΡ‚ Π·Π° всСки Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Всички Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ инструкции ΠΈΠΌΠ°Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°; Π°Π· ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ… Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ стойности Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ ΠΊΠ°Ρ‚ΠΎ 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:

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

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ слСдния ΠΊΠΎΠ΄ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина:

Код Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина

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 ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Ρ‰Π΅ бъдС възмоТно Π΄Π° сС Π²Π·Ρ€ΠΈΠ²ΠΈ ΠΈΠ»ΠΈ изпуснС Π±Π°Π»ΠΎΠ½Π°.


Π’ΠΎΠ²Π° Π΅ всичко! АлСксСй дСмонстрира високо Π½ΠΈΠ²ΠΎ Π½Π° знания, достойно Π·Π° индустриалСн Π½ΠΈΠ½Π΄ΠΆΠ° :) Π˜Π·ΠΏΡ€Π°Ρ‚ΠΈΡ…ΠΌΠ΅ запомнящи сС Π½Π°Π³Ρ€Π°Π΄ΠΈ Π½Π° побСдитСля. Много благодаря Π½Π° всички участници!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с DDoS Π·Π°Ρ‰ΠΈΡ‚Π°, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ ΡƒΠ΅Π± хостинг със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS Π°Ρ‚Π°ΠΊΠΈ, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster