지난번 Modbus 통신을 확인한 것에 이어서 이번엔 Wireshark로 Modbus 패킷을 분석하는 실습을 해보려고 한다.
기존에 구축한 Modbus 통신 환경에서 Wire Shark만 추가하면 된다.
단계별로 실습을 진행해보았다.
Wireshark를 실행해 "Adapter for loopback traffic capture"를 선택하고 캡처를 시작한다.

127.0.0.1 → 127.0.0.1 TCP 61390 → 502 [SYN]
127.0.0.1 → 127.0.0.1 TCP 502 → 61390 [SYN, ACK]
127.0.0.1 → 127.0.0.1 TCP 61390 → 502 [ACK]
TCP 3-Way Handshake 후 클라이언트와 서버가 연결되는 것이 확인됐다.
Modbus… Query: Trans: 4; Unit: 0, Func: 3: Read Holding Registers
내가 세팅한 Function3(Holding Registers)이 그대로 적용되었다.
Modbus… Response: Trans: 4; Unit: 0, Func: 3: Read Holding Registers
서버의 응답부분이다.
FC5(Write a Single Coil)
Register의 Value값을 Request 패킷에서 확인할 수 있다.
아래 사진은 각각 Register 0을 0과 123으로 설정하고 Send 했을 때이다.


실습한 Function Code
- FC5(Write a Single Coil)
- FC6(Write Multiple Registers)
FC5는 특정 코일을 ON/OFF 하는 기능이다.
참고로 코일은 1 bit이고, 0 또는 1의 값을 갖는다.
Simply Modbus에서 Function Code를 5(Write Single Coil)으로 변경하고 패킷을 확인해보자.

그런데 Function Code만 5으로 변경하고 Send를 하려하면 위와 같은 창이 뜬다.

OK를 누르고 좌측 하단에 있는 [WRITE] 버튼을 누른다.

mode: TCP
IP Address: 127.0.0.1
Port: 502
Slave ID: 0
function code: 5
register size: 1 bit coils
위와 같이 설정한다.
중요한 것은 F5는 이전에 실습한 F3이랑 다르게 읽기가 아닌 쓰기(변경)가 가능하다.
서버(Ananas)에게 Coil 0번을 ON(=FF00) 상태로 바꾸라고 하는것이다.

따라서 방화벽과 IDS가 필수적이다.
[참고]
Coil ON → 0xFF00
Coil OFF → 0x0000
😶왜 1바이트0x01을 안 쓰고 2바이트 FF00을 쓸까?진짜 궁금해서. . .
Modbus는 대부분 16비트 단위(2 bytes)로 값을 다룬다. 따라서 1비트짜리 ON/OFF도 결국 2바이트로 표현해야한다.
ON FF00에서 FF는 참, TRUE, ON의 의미이고, 하위 바이트는 무조건 00인 예약영역이다.
OFF는 0000 = 00000000 00000000로서 두 바이트 모두 0, 거짓이 되는것이다.
FC6은 숫자 여러 개를 한 번에 WRITE하는 기능이다.


위와같이 설정하고 SEND 버튼을 누른다.


첫번째 사진의 Request 패킷을 보면 다음과 같은 내용을 알 수 있다.
클라이언트(Simply Modbus TCP Client)가
이 값들을 이 레지스터들에 Write 해주라고 서버(ANANAS)에 보내는 패킷이다.
실제 쓰려는 값(123, 456 같은 값이 여기 있음)
두번째 사진의 Response 패킷을 보면 다음과 같은 내용을 알 수 있다.
이건 서버(ANANAS)가 니가 요청한 대로 잘 썼다고 답장을 보내는 패킷이다.
Response에는 실제 값(123, 456)이 안들어 있다.
ALLOW 192.168.10.10 → PLC :502 FC=3
DENY ANY → PLC :502 FC=5,6,15,16