보낼 수 있는 바이너리 파일이 있습니다 netcat
.
$ nc -l localhost 8181 < my.dat
파일에는 다음 내용이 포함되어 있습니다.
$ xxd my.dat
0000000: 0006 3030 3030 4e43 ..0000NC
내가 정말로 원하는 것은 16진수 문자열을 직접 보내는 것입니다. 나는 이것을 시도했습니다 :
$ echo '0006303030304e43' | nc -l localhost 8181
그러나 위 명령은 ASCII 문자열을 nc
.
답변1
내가 사용하는 것은-아르 자형그리고-피스위치xxd:
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
영감을 얻은 @Gilles의 답변 덕분에 Perl 버전은 다음과 같습니다.
$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
답변2
xxd
or가 없는 솔루션 은 다음과 같습니다 perl
.
echo
쉘의 내장 기능이 이를 지원하는 경우 ( bash
그리고 zsh
지원하지만 지원하지 않음)dash
), 올바른 백슬래시 이스케이프를 사용해야 합니다.
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
당신 /bin/echo
이 가지고 있다면GNU 핵심 도구(Linux 시스템에서는 거의 표준) 또는 busybox에서 사용할 수 있습니다.
다음을 사용하면 sed
이스케이프 패턴을 생성할 수 있습니다.
$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
포괄적인:
echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
답변3
가지고 있다면 xxd
간단합니다. 16진수 간에 변환할 수 있습니다.
echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
POSIX 도구만 사용하여 16진수를 바이너리로 변환하는 합리적이고 빠른 방법은 없다고 생각합니다. Perl에서는 이 작업을 매우 쉽게 수행할 수 있습니다. 다음 스크립트는 16진수가 아닌 입력 문자를 무시하고 16진수를 2진수로 변환합니다. 입력 줄에 홀수의 16진수가 포함되어 있으면 오류가 발생합니다.
#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
tr/0-9A-Fa-f//cd;
if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
if (length($_) & 1) { s/(.)$//; $c = $1; }
print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }
정말로 POSIX를 고수해야 한다면(예: 임베디드 장치에서) 다음을 사용하는 것이 좋습니다.Base6416진수 대신. 당신은 그것을 사용할 수 있습니다우드 코드Base64를 디코딩합니다. 입력에는 헤더 형식과 다음에 의해 생성된 끝 줄이 있어야 합니다.유 인코딩, 원시 Base64일 수 없습니다.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
답변4
표준 입력에서 다양한 변환을 수행하고 그 결과를 표준 출력으로 출력하는 도구를 작성했습니다. cryptocli dd
이러한 변환만 수행되며 다른 작업은 수행되지 않습니다.
echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081
당신을 위해 일할 것입니다.
이 도구는 오픈 소스이며 여기에서 찾을 수 있습니다.https://github.com/tehmoon/cryptocli
편집하다:
내 도구를 사용하여 16진수로 직접 인코딩할 수도 있습니다.
cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081