从xxd获取一些输出并将其手动转换为可用的shellcode并不有趣,因此您的工作是使过程自动化。
规则
您提交的内容可以是函数,lambda,脚本或任何合理的等效形式。您可以打印结果,或者如果您提交的是函数/ lambda,则还可以将其返回。
您的程序必须带有三个参数,第一个是包含xxd输出的字符串,运行时除了文件名外都没有其他参数,例如:xxd some_file
。这是第一个参数的示例:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
您需要截取包含字节的中间部分(之后的前8列:
),然后通过删除所有空格将其转换为shellcode,然后\x
在每个字节之前放置一个。
以下是上述输入的输出(忽略任何其他参数):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
您可以假设第一个参数将始终是有效的xxd输出,并且除了文件名外都没有其他参数。
您的输出也应该是一个字符串,其中反斜杠是文字反斜杠,而不用作转义符。因此,当我说“ \ x65”时,我并不是在说字节0x65,甚至不是字母“ A”。在代码中,它将是字符串“ \ x65”。
第二个参数指定shellcode在xxd输出中应从何处开始,第三个参数应指定应在何处结束。如果第三个参数是-1
,它将在xxd输出的结尾处结束。第二和第三个参数也将始终为非负值,除非第三个参数为-1
以下是一些测试案例:
争论1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
参数2 7
,,参数3 :(e
这两个都是代表十六进制数字的字符串)
输出: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
争论1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
参数2 0
,参数3:2e
输出: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
争论1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
参数2 a
,参数3:-1
输出: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
字节最少的代码获胜。获奖者将在2016年8月15日的7天内宣布(但此后提交的作品仍将受到赞赏)。
更新资料
恭喜@Adnan赢得了挑战!
~
而不是\x7e
。我们可以\t
代替\x09
吗?
7
看起来像是从零开始的索引,并且e
是从一开始的索引(e-7=7
但是您的输出中有8个十六进制代码),还是我忽略了什么?