Как декодировать эту информацию из strace output

Я написал небольшой go script и проследил его, используя strace хотя это script, я пытаюсь получить сообщения аудита из ядра, используя протокол netlink, точно так же, как auditd.

Ниже показан вывод strace на моем пути script - http://paste.ubuntu.com/8272760/

Я пытаюсь найти аргумент, который auditd предоставляет функции sendto. Когда я запускаю strace on auditd, я получаю следующий вывод

sendto(3, "\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0", 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16

И когда я собираю свой файл go, я получаю следующий вывод. Я хочу декодировать второй аргумент этого утверждения

sendto(3, "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t", 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17

Чтобы быть конкретным

"\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t" 

Теперь я хочу преобразовать это в массив строк или байтов, есть ли способ преобразовать это в массив строк или байтов?

В моем действительном коде go этот аргумент представляет собой массив байтов.

https://github.com/mozilla/Audit-Go/blob/testing/netlink_old.go#L58

Ответ 1

Мое понимание вашей проблемы заключается в том, что вы пытаетесь сравнить то, что auditd посылает на то, что посылает ваша программа, сравнивая вывод strace, и у вас есть проблемы с преобразованием строки, предоставленной strace, в тип данных байта [].

Выход strace следует за представлением GNU C строкового литерала, символы которого могут быть экранированы следующим образом:

\\ Backslash character. 
\? Question mark character.
\' Single quotation mark. 
\" Double quotation mark. 
\a Audible alert. 
\b Backspace character. 
\e <ESC> character. (This is a GNU extension.) 
\f Form feed. 
\n Newline character. 
\r Carriage return. 
\t Horizontal tab. 
\v Vertical tab.
\o, \oo, \ooo Octal number.
\xh, \xhh, \xhhh, ... Hexadecimal number.

Обратите внимание, что число восьмеричных или шестнадцатеричных цифр может быть переменной. В Go символы также могут быть экранированы, но правила разные - см. http://golang.org/ref/spec#Rune_literals

В частности, восьмеричные значения систематически на 3 цифры, чтобы избежать какой-либо двусмысленности. Чтобы объявить [] байт с такой последовательностью символов, вам нужно будет написать что-то вроде этого:

// In strace, it was "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
wb := []byte("\021\000\000\000\350\003\005\000\001\000\000\000\000\000\000\000\t")

Обратите внимание, что опция -x в strace будет использовать шестнадцатеричное кодирование с фиксированной длиной для непечатаемых символов, что упрощает прямое использование этих строк в программе Go. Параметр -xx выводит шестнадцатеричные кодированные байты даже для печатаемых символов, что делает его еще проще ИМО.

Во всяком случае, не обязательно хороший стиль (или даже хорошая идея) использовать литералы для инициализации [] байт. Строки предназначены для символов UTF-8, а не для двоичных данных.

Ответ 2

\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t

Это escape-последовательности символов, как определено в ANSI X3.159-1989 (aka ANSI C89, проверьте это PDF файл). Вы можете найти официальные черновики страниц port70.net.

Ниже приведен короткий текст в man printf:

  • \a Напишите символ <bell>.
  • \b Напишите символ <backspace>.
  • \c Игнорировать оставшиеся символы в этой строке.
  • \e Напишите символ <escape>.
  • \f Напишите символ <form-feed>.
  • \r Напишите символ <carriage return>.
  • \n Напишите символ <new-line>.
  • \t Напишите символ <tab>.
  • \v Напишите символ <vertical tab>.
  • \' Напишите символ <single quote>.
  • \" Напишите символ <double quote>.
  • \\ Напишите символ обратной косой черты.
  • \num, \0num Напишите 8-битный символ, значение ASCII которого представляет собой восьмеричное число 1-, 2- или 3-значное.

Чтобы интерпретировать эти символы как строку, вы можете использовать printf, например. команда в оболочке:

printf "%b" "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"

Для получения более подробных примеров проверки, проверьте: Как разобрать strace в оболочке в обычный текст?

Ответ 3

Если вы хотите, чтобы strace печатал шестнадцатеричную строку вместо ASCII и escape-последовательности, используйте -x или -xx, проконсультируйтесь с человеком для получения более подробной информации.