Linux-二进制ASCII互转的实现


初衷是想在Linux中利用命令实现二进制和ASCII的互转,所以专门找了一下资料,为此记录一下方法,方便我做CTF的题目,哈哈。

Ax Linux Command Method Solution

希望有一种这样的工具

$ echo "This is a binary message" | ascii2bin
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
$ echo "01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101" | bin2ascii
This is a binary message

Using Perl

StéphaneChazelas 提供

# 不带空格
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
# 带空格
$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB
  • -e *expression*计算给定表达式作为perl代码
  • -psed模式。将针对输入的每一行评估表达式,并将行的内容存储在$_变量中,并在计算表达式之后将其打印出来。
  • -l:甚至更像sed:而不是完整的行,只有行的内容(即没有行定界符)在其中$_(并且在输出中添加了换行符)。因此,除了它是代码而不是代码之外,其perl -lpe code工作方式类似。sed code``perl``sed
  • unpack "B*"``$_默认情况下对变量起作用,并将其内容提取为从第一个字节的最高位到最后一个字节的最低位的位字符串。
  • pack做的反面unpack。有关perldoc -f pack详细信息,请参见。
  • (假设输入为8位块(0填充))。使用unpack "(B8)*",我们一次提取8位,然后使用将空格与结果字符串连接起来join " "

Using xxd

slm 提供

$ echo -n "A" | xxd -b
0000000: 01000001                                               A
# 关于第一个烦人的列和行末的基本输入,可以使用管道符awk输出
# echo -n "A" | xxd -b | awk '{print $2}'
# PS:使用 xxd -ps 显示纯输出

$ echo -n "A" | xxd -b | awk '{print $2}'
01000001

Using bc

slm 提供

$ echo "obase=2; ibase=16; A" | bc
1010

$ echo "obase=16; ibase=2; 1010" | bc
A

Using bash shell

弗雷德里克·杜威特 提供

#!/bin/bash

chrbin() {
        echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}

ordbin() {
  a=$(printf '%d' "'$1")
  echo "obase=2; $a" | bc
}

ascii2bin() {
    echo -n $* | while IFS= read -r -n1 char
    do
        ordbin $char | tr -d '\n'
        echo -n " "
    done
}

bin2ascii() {
    for bin in $*
    do
        chrbin $bin | tr -d '\n'
    done
}

# 使用方法

$ ascii2bin "This is a binary message"
$ bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101

Using Python

python2

>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'

相反:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'

python3

>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

相反:

>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'

python3 scripts

#!/usr/bin/env python3

import sys


if __name__ == "__main__":
    if len(sys.argv) != 1 and len(sys.argv) <= 3:
        if sys.argv[1] in ('-b', '--binary'):
            n = int(sys.argv[2].replace(' ', ''), 2)
            print(n.to_bytes((n.bit_length() + 7) // 8, 'big').decode())
        if sys.argv[1] in ('-a', '--ascii'):
            print((bin(int.from_bytes(sys.argv[2].encode(), 'big')))[2:])
    else:
        print("Example: decode -b '10000001'")

使用方法

$ bin2ascii -a "Hello, world!"
1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001

$ bin2ascii -b 1001000011001010110110001101100011011110010110000100000011101110110111101110010011011000110010000100001  
Hello, world!

Base64 and Binary

通过base64编码二进制

$ echo "This is a binary message" | base64
VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==

解码base64

$ echo "VGhpcyBpcyBhIGJpbmFyeSBtZXNzYWdlCg==" | base64 -d
This is a binary message

文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录