我需要知道如何从机器代码中删除null(00)。我用汇编语言编写代码。它运行成功。我需要没有NULL的输出
.data
Bash:
.asciz "/bin/hostname"
Null1:
.int 0
AddrToBash:
.int 0
NULL2:
.int 0
.text
.globl _start
_start:
#execute routine
xor %eax,%eax
movl $Bash, AddrToBash
movl $11,%eax
movl $Bash,%ebx
movl $AddrToBash,%ecx
movl $NULL2,%edx
int $0x80
#exit routine
Exit:
movl $10,%ebx
movl $1,%eax
int $0x80
以下输出
4000b0: 31 c0 xor %eax,%eax
4000b2: c7 04 25 f2 00 60 00 movl $0x6000e0,0x6000f2
4000b9: e0 00 60 00
4000bd: b8 0b 00 00 00 mov $0xb,%eax
4000c2: bb e0 00 60 00 mov $0x6000e0,%ebx
4000c7: b9 f2 00 60 00 mov $0x6000f2,%ecx
4000cc: ba f6 00 60 00 mov $0x6000f6,%edx
4000d1: cd 80 int $0x80
00000000004000d3 <Exit>:
4000d3: bb 0a 00 00 00 mov $0xa,%ebx
4000d8: b8 01 00 00 00 mov $0x1,%eax
4000dd: cd 80 int $0x80
如何删除00,
我做了更改,如eax
到al
,bx
到bl blahahahahahaha ......但不行
有人可以修改它.......
答案 0 :(得分:3)
如果要避免shellcode中的NULL字节,则必须考虑很多事情。但是,大部分时间它都涉及用等效的指令替换指令。
例如,
mov $0, %eax
生成包含NULL字节的b8 00 00 00 00
。用
xor %eax, %eax
在语义上是等效的,但却生成31 c0
。
有关编写shellcode的详细介绍,请阅读Smashing The Stack For Fun And Profit。本书Hacking: The Art of Exploitation包含一个关于避免shellcode中的NULL字节的部分(0x523)。
答案 1 :(得分:0)
因此,您希望使用不包含字节0的操作码。这仅用于创建带字符串的缓冲区溢出(例如:strcpy()
)。
要么你很好地学习汇编,那么你就会知道大多数常用指令的二进制编码,从而能够避免使用现有的工具:将原始代码编码为表示而不用0字节(例如:BCD,base64,甚至像010010010
这样的ASCII字符串),并在其前面加上一个不包含零的特殊描述符。