Har*_*eja 6 c audit go strace netlink
我写了一个小的go脚本并使用strace跟踪它,虽然这个脚本,我试图使用netlink协议从内核获取审计消息,就像auditd一样.
以下是我去的脚本输出 - http://paste.ubuntu.com/8272760/
我试图找到auditd提供给sendto函数的参数.当我在auditd上运行strace时,我得到以下输出
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
Run Code Online (Sandbox Code Playgroud)
当我扫描我的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
Run Code Online (Sandbox Code Playgroud)
再具体一点
"\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
Run Code Online (Sandbox Code Playgroud)
现在我想将其转换为字符串或字节数组,有没有办法将其转换为字符串或字节数组?
在我的实际转码中,这个参数是一个字节数组.
https://github.com/mozilla/Audit-Go/blob/testing/netlink_old.go#L58
我对您的问题的理解是您尝试通过比较strace输出来比较auditd发送到您的程序发送的内容,并且您有将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.
Run Code Online (Sandbox Code Playgroud)
请注意,八进制或十六进制数字的数量可以是可变的.在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")
Run Code Online (Sandbox Code Playgroud)
请注意,strace中的-x选项将对不可打印的字符使用固定长度十六进制编码,这使得在Go程序中直接使用这些字符串变得更容易.-xx选项将输出十六进制编码的字节,即使是可打印的字符,这使IMO更容易.
无论如何,使用文字字符串来初始化[]字节不一定是好的风格(甚至是好主意).字符串用于UTF-8字符,而不是二进制数据.
\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t
这些是定义在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在 shell 中使用,例如命令:
printf "%b" "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
Run Code Online (Sandbox Code Playgroud)
更多解析示例请查看:如何将 shell 中的 strace 解析为纯文本?