Различный ответ между питоном и Java - PullRequest
0 голосов
/ 04 октября 2019

Я отправляю пакет SMB, ответ различается для разных языков, но разница только в один байт, он добавляет 0D с питоном

00 00 00 55 FF 53 4D 42 72 0000 00 00 98 01 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2F 4B 00 00 C5 5E 11 03 00 03 0D 0A 00 01 00 04 11 00 00 00 00 01 00 0000 00 00 FD E3 00 80 12 E5 E0 59 36 7A D5 01 88 FF 00 10 00 B0 44 B3 6C 20 08 11 44 ​​A9 84 31 87 23 FC C7 45

Python:

buffersize = 1024
timeout = 5.0
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.settimeout(timeout)
client.connect((ip, port)) 
client.send(negotiate_proto_request())
tcp_response = client.recv(buffersize)

Java:

Socket s = new Socket(ip, port);
OutputStream out = s.getOutputStream();
out.write(negotiate_proto_request().getBytes());
out.flush();

InputStream input = s.getInputStream();
InputStreamReader reader = new InputStreamReader(input);
tcp_response = "";
int i = 0;
tcp_response += (char) reader.read();
tcp_response += (char) reader.read();
tcp_response += (char) reader.read();
int len = reader.read();
tcp_response += (char) len;
while (i < len) {
    tcp_response += (char) reader.read();
    i++;
}
out.close();
s.close();

1 Ответ

1 голос
/ 04 октября 2019

Не совсем ответ ... после анализа ответа Python некоторые значения полей выглядят немного странно. И мимо логического конца PDU есть байт. Я пришел к выводу, что дополнительный байт 0d был вставлен по ошибке, но я не могу сказать, почему.

Это SMB, а не CIFS, в зависимости от формата ответа.

Спецификация SMB

Ответ Python

00 00 00 55 

header 

FF 53 4D 42       protocol identifier
72                negprot
   00 00 00  
00                status
   98             flags  (response + others)
      01 28       flags2
00 00             pid high
      00 00 
00 00 00 00 
00 00             security features
      00 00       rsvd
00 00             tid
      2F 4B       pid low
00 00             uid
      C5 5E       mid

params

11                word count (17)
   03 00          dialect index 3
         03       security mode
0D 0A             max mpx (2573 ?!)
      00 01       max vcs (256 ?!)
00 04 11 00       max buff size (1,115,136‬ ?!)
00 00 00 01       max raw size (1 ?!)
00 00 00 00       session key
00 FD E3 00       capabilities
80 12 E5 E0  
59 36 7A D5       server time
01 88             server tz (34817 ?!)
      FF          challenge len (255 ?!)

data
      00 
10                byte count
   00 B0 44 
B3 6C 20 08 
11 44 A9 84 
31 87 23 FC 
C7                server guid

   45             fell off the end
                  or maybe I have forgotten
                  the SMB alignment rules

Некоторые числовые поля имеют совершенно неправдоподобные числа;пометил их как «?!».

Ответ Java

 00 00 00 55

header (same as before)

 FF 53 4D 42
 72 00 00 00
 00 98 01 28
 00 00 00 00
 00 00 00 00
 00 00 00 00
 00 00 2F 4B
 00 00 C5 5E

params 

 11              word count (17)
    03 00        dialect index 3
          03     security mode
 0A 00           max mpx (10)
       01 00     max vcs (1)
 04 11 00 00     max buffer (4356)
 00 00 01 00     max raw (64k)
 00 00 00 00     session key
 FD E3 00 80     capabilities
 12 E5 E0 59     server time
 36 7A D5 01  
 88 FF           server tz (-120)
       00        challenge len

data 
          10    
 00              byte count (16)
    B0 44 B3
 6C 20 08 11
 44 A9 84 31
 87 23 FC C7 
 45

Поля имеют гораздо больший смысл в версии Java.

Итак вот моя попытка фактически ответить на подразумеваемый вопрос - версия Python неверна;по какой-то причине он решил вставить дополнительный байт. Дополнительный байт равен 0D, который может интерпретироваться как ASCII CR, и находится перед байтом, который, как оказалось, имеет значение 0A, которое может (неправильно) интерпретироваться как ASCII LF. Таким образом, мы могли бы догадаться, что это какая-то ошибочная процедура преобразования текста в нетекстовые данные.

== Эпилог ==

Да, есть более простой способ определить, какая из них неправильная. Длина SMB должна быть 0x55 (85) от первого слова сообщения. В версии Java 85 байтов, в версии Python 86 байтов. QED.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...