Como corretamente anular saída de strace

1

Como faço para desabotoar as strings produzidas por strace ? Eu vejo alguns conselhos para usar printf '%b' para isso, mas isso não funciona corretamente para mim em alguns casos. Considere echo -ne '71' :

$ strace -e write echo -ne '71'
write(1, "71", 21)                    = 2
+++ exited with 0 +++

Agora, se eu alimentar isso em printf :

$ printf "%b" "71" | xxd -p
f9

Enquanto na realidade era:

$ echo -ne '71' | xxd -p
1f31

Obviamente, printf %b interpreta 71 como 1 (como deveria, de acordo com o homem ). Isso significa que printf não é realmente adequado para decodificar strace output. O que devo usar em vez disso?

    
por torvin 26.05.2018 / 01:59

1 resposta

2

tl; dr - ver "conclusão" no final.

O que acontece aqui é bastante interessante.

Primeiro, echo -e age assim (de man 1 echo ):

%b
ARGUMENT as a string with \ escapes interpreted, except that octal escapes are of the form

\NNN
byte with octal value NNN (1 to 3 digits)

or %bl0ck_qu0te%NNN

NNN
byte with octal value NNN (1 to 3 digits)

Isso significa que 0 em 7 não é um dígito octal, é apenas uma parte do prefixo 7 que indica entrada octal consecutiva. Seu 037 pode ser echo -e e agora apenas o segundo 1 é um dígito octal.

Ainda dentro de 161 strace é equivalente a \ . Isso é equivalente a printf "%b" "71" , um caractere literal que significa "um".

Agora, parece que a parte da saída printf FORMAT [ARGUMENT]… que você deseja decodificar deve ser decodificada dessa maneira:

write(1, "71", 21)
          ^     prefix that indicates consecutive octal output
           ^^^  three digits of octal output
              ^ literal character meaning "one"

Portanto, o prefixo aqui não é man 1 printf , mas FORMAT .

Você usa %b . A forma geral é echo -e e é isso que FORMAT diz sobre \ sendo strace :

%bl0ck_qu0te%

Como você pode ver, o prefixo é strace , como em 0 . A interpretação agora é assim:

printf "%b" "71"
             ^^    prefix that indicates consecutive octal input
               ^^^ three octal digits

Isso explica o seu resultado errado. No entanto, o mesmo manual declara que dentro de 1 octal digits são interpretados de uma maneira ligeiramente diferente:

%bl0ck_qu0te%

O prefixo é printf exatamente como na saída de strace . Além disso, FORMAT parece tomar cuidado sempre que o próximo caractere puder ser interpretado como um dígito octal. Comparar:

$ strace -e write echo -ne '7'
write(1, "", 1)                      = 1
+++ exited with 0 +++

para

$ strace -e write echo -ne '71'
write(1, "A", 21)                    = 2
+++ exited with 0 +++

para

$ strace -e write echo -ne '71'
write(1, "71", 21)                    = 2
+++ exited with 0 +++

Observe o ARGUMENT no último caso. Está lá para evitar FORMAT , que seria interpretado como um único byte.

Parece que você pode usar %b para decodificar ARGUMENT output, mas deve passá-lo como sed , não \ :

$ printf "71" | xxd -p
1f31

Mas, em seguida, outras sequências interpretadas dentro de %b (por exemplo, FORMAT ) podem causar problemas, por isso é melhor manter o ARGUMENT . Eu joguei com strace para transformar %code% em %code% em casos apropriados, ficou incômodo rapidamente; então eu percebi que %code% as %code% também interpretaria outras seqüências em %code% ! Na minha opinião, é um beco sem saída.

Conclusão: é melhor alterar o comportamento de %code% . Tente saída hexadecimal:

$ strace -xx -e write echo -ne '71'
write(1, "\x1f\x31", 21)                    = 2
+++ exited with 0 +++

Então

$ printf "%b" "\x1f\x31" | xxd -p
1f31
    
por 26.05.2018 / 22:25