od命令使用绕过输出内容检测
题目 justCTF2020 MyLittlePwny
在日常做的大部分命令执行题目都是对输入的内容进行检测,但是这一题就是对输出的内容进行检测,执行命令后输出的内容不能出现字符,该如何绕过呢?
引出本次要介绍的命令:“od”:

(sage-sh) 32541@ch:~$ cat flag
hello
(sage-sh) 32541@ch:~$ od flag
0000000 062550 066154 005157
0000006
由以上命令可见我们“flag”文件里的内容为“hello”由"od"命令输出后为一串数字,即可绕过对命令执行后输出内容进行检测了
那么该串数字又有什么意义,怎么还原呢?
exp:
a="0000000 062550 066154 005157 0000006"
print(b''.join(int(ss, 8).to_bytes(2, 'little') for ss in a.split()))
运行结果: b'\x00\x00hello\n\x06\x00'
可见"hello"被还原了出来
exp代码讲解:
将需要转换的数值串赋值给a
将a通过空格分割成5组字符串,每一组字符串实际上为8进制数,再将每一组字符串还原回十进制后转换为小端字节序并且分割成两个
什么是大小端字节序:
>>> a=2048
>>> a.to_bytes(3,'little')
b'\x00\x08\x00'
>>> a.to_bytes(4,'little')
b'\x00\x08\x00\x00'
>>> a.to_bytes(2,'little')
b'\x00\x08'
>>> a.to_bytes(2,'big')
b'\x08\x00'
>>> int('800',16)
2048由以上代码很容易理解大小端字节序实际上就是转换为16进制后返回的排列顺序不一样,大端字节序就是正序,小端字节序就是倒叙
所以exp最后一部分就很好理解了,就是将8进制转换到10进制再每一部分转换为16进制倒叙后转换成字符输出