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

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

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

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

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

3 ответа

Решение

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

Вывод 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

В частности, восьмеричные значения систематически состоят из 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 выводит закодированные в шестнадцатеричном формате байты даже для печатаемых символов, что делает IMO еще проще.

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

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

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

Это escape-последовательности символов, определенные в ANSI X3.159-1989 (ака 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 в оболочке в обычный текст?

Другие вопросы по тегам