标签: shellcode

为什么 Linux 上的 NASM 会更改 x86_64 程序集中的寄存器

我是 x86_64 汇编编程的新手。我正在用 x86_64 程序集编写简单的“Hello World”程序。下面是我的代码,它运行得很好。

global _start

section .data

    msg: db "Hello to the world of SLAE64", 0x0a
    mlen equ $-msg

section .text
    _start:
            mov rax, 1
            mov rdi, 1
            mov rsi, msg
            mov rdx, mlen
            syscall

            mov rax, 60
            mov rdi, 4
            syscall 
Run Code Online (Sandbox Code Playgroud)

现在,当我在 gdb 中反汇编时,它会给出以下输出:

(gdb) disas
Dump of assembler code for function _start:
=> 0x00000000004000b0 <+0>:     mov    eax,0x1
   0x00000000004000b5 <+5>:     mov    edi,0x1
   0x00000000004000ba <+10>:    movabs rsi,0x6000d8
   0x00000000004000c4 <+20>:    mov    edx,0x1d
   0x00000000004000c9 <+25>:    syscall
   0x00000000004000cb <+27>:    mov …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 nasm micro-optimization shellcode

4
推荐指数
2
解决办法
1274
查看次数

执行 shell 的 Shellcode 会导致分段错误

我正在尝试运行此代码来获取 shell,但即使禁用了 ASLR,我也会遇到分段错误。我在装有 Ubuntu 20.04 64 位版本的 AMD Ryzen 3 计算机上运行此代码。

我正在使用以下命令进行编译:

$ gcc -O0 -fno-stack-protector -z execstack getshell.c -o getshell
Run Code Online (Sandbox Code Playgroud)

文件getshell.c如下:

#include <stdio.h>

unsigned char shellcode[] = \
"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05";
int main()
{
    int (*ret)() = (int(*)())shellcode;
    ret();
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在这里找到了这段代码

c shellcode

4
推荐指数
1
解决办法
445
查看次数

使用内联汇编启动shell

我正在完成一项学校任务,我完全被难过了.教授和助教没有任何帮助,因为他们为任何学生提供的每一个答案都是"继续寻找,答案就在那里"的一些变化.我正在尝试使用以下代码创建一个shell:

#include <stdio.h>
#include <stdlib.h>

const char code[] =
"\x31\xc0"
"\x50"
"\x68""//sh"
"\x68""/bin"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x99"
"\xb0\x0b"
"\xcd\x80"
;

int main(int argc, char **argv)
{
printf("running...\n");

char buf[sizeof(code)];
strcpy(buf, code);
((void(*)( ))buf)( );
}
Run Code Online (Sandbox Code Playgroud)

我试图code[]用在网上找到的其他一些例子(包括这个网站)取代,以及教授提供的另一个例子.这些都没有用.我使用gdb进行反汇编并试图构建自己的code[],并且失败了.对于它的价值,我可以说,在普通用户中,我的应用程序会((void(*)( ))buf)( );在线路上发生段错误,只是在同一行的root用户中退出(没有段错误通知).

我不知道在哪里采取这个任务,我不能处理任何后来的缓冲区溢出任务,直到我能理解这个简单的第一步.任何帮助将大大赞赏.

编辑:我忘了提到,我已经在OSX 10.8.2上和通过VirtualBox在Ubuntu VM上尝试过这个.我假设它不适用于OSX,但我很绝望.ha对于Ubuntu,我们被要求做:

sudo #sysctl -w kernel.randomize_va_space = 0

sudo apt-get install zsh cd/bin sudo rm sh sudo ln -s/bin/zsh/bin/sh

这些命令应禁用地址空间随机化,安装zsh并将其链接到/ bin/sh.我在VM中完成了所有这些任务,没有任何错误

assembly buffer-overflow stack-smash shellcode

3
推荐指数
1
解决办法
2972
查看次数

无法使用ld - Mac OS X链接目标文件

/*********
exit.asm
*/

[SECTION .text]

global _start


_start:
xor eax, eax
xor ebx, ebx
mov al, 1
int 0x80

//****************************
Run Code Online (Sandbox Code Playgroud)

首先,我使用nasm -f elf exit.asm生成目标文件.

然后我在我的Mac OS X 10.7上运行了以下"ld"命令,它有这些输出和警告,我试图在我的32位linux机器上运行它,一切都很顺利,请你解释为什么不会链接器在我的Mac上运行?

谢谢!

Alfred says: ld -o exiter exit.o
ld: warning: -arch not specified
ld: warning: -macosx_version_min not specified, assuming 10.7
ld: warning: ignoring file exit.o, file was built for unsupported file format ( 0x7f 0x45      0x4c 0x46 0x 1 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 …
Run Code Online (Sandbox Code Playgroud)

c assembly shellcode

3
推荐指数
2
解决办法
1万
查看次数

如何检查给定shellcode执行的命令?

可以说我给了以下shellcode:

char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
Run Code Online (Sandbox Code Playgroud)

如何检查它代表什么/它代表的ASM指令?谢谢 :)

linux assembly system-calls shellcode

3
推荐指数
1
解决办法
992
查看次数

C代码说明

有人可以帮我解释一下这些代码吗?

char code[] = "paste your shellcode here";

int main(int argc, char **argv)
{
   int (*func)();
   func = (int (*)()) code;
   (int)(*func)();
}
Run Code Online (Sandbox Code Playgroud)

c shellcode

3
推荐指数
1
解决办法
766
查看次数

为什么带有jmp指令的shellcode工作,为什么标签不能在C包装器内工作?

我有两个汇编代码,如下所示

file:a.asm

section .text
global _start
_start: mov eax, 4
        mov ebx, 1
        mov ecx, mesg
        mov edx, 10
        int 0x80
        mov eax, 1
        int 0x80
mesg    db      "KingKong",0xa
Run Code Online (Sandbox Code Playgroud)

和另一个汇编代码

档案:b.asm

section .text
global _start

_start: jmp mesg

prgm:   mov eax, 4
        mov ebx, 1
        pop ecx
        mov edx, 10
        int 0x80
        mov eax,1
        int 0x80
mesg:   call prgm
        db "KingKong",0xa
Run Code Online (Sandbox Code Playgroud)

在获取这两个代码的十六进制并将其放入此C包装器之后

char *b = "\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\xb9\x7d\x80\x04\x08\xba\x0a\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80\x4b\x69\x6e\x67\x4b\x6f\x6e\x67\x0a";

char *b = "\xe9\x19\x00\x00\x00\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x59\xba\x0a\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80\xe8\xe2\xff\xff\xff\x4b\x69\x6e\x67\x4b\x6f\x6e\x67\x0a";
int main()
{
        (*(int (*)(void))a)();
}
Run Code Online (Sandbox Code Playgroud)

第一个汇编代码(b)按预期打印'KingKong',但第二个汇编代码a …

x86 assembly machine-code shellcode

3
推荐指数
1
解决办法
857
查看次数

Python Ctype分段错误

这是使用ctype运行shellcode的代码.shellcode在64位linux上运行"whoami".但是这个程序给了我一个"分段错误".但是我无法弄清楚它中的错误.代码的结构来自: ctypes:将字符串转换为函数?

#!/usr/bin/python

from ctypes import *

# /usr/bin/whoami
shellcode_data = ("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68\x00\x53"
"\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6\x52\xe8\x10\x00"
"\x00\x00\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61"
"\x6d\x69\x00\x56\x57\x48\x89\xe6\x0f\x05");

shellcode = c_char_p(shellcode_data)
function = cast(shellcode, CFUNCTYPE(None))
function()
Run Code Online (Sandbox Code Playgroud)

对于32位架构,这将是shell代码:

shellcode_data = ("\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68"
"\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x10\x00\x00\x00\x2f"
"\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61\x6d\x69\x00"
"\x57\x53\x89\xe1\xcd\x80");
Run Code Online (Sandbox Code Playgroud)

python ctype shellcode

3
推荐指数
1
解决办法
1587
查看次数

避免使用JMP CALL POP技术进行shellcode NASM的JMP?

即使两个程序都遵守shellcode执行所需的相对寻址指令,并且两者都在执行时打印所需的消息,但第二个示例在用作shellcode时失败.谁能解释一下这种行为?奇怪的是,与第一个相同的第三个样本也失败了.

输出: 样本1 Hello World

其他样本(2和3)打印垃圾值

样品1

global _start
section .text
        _start:
                jmp widen

        pHworld:
                pop rsi
                xor rax,rax
                mov al,1
                mov rdi,rax
                mov rdx,rdi
                add rdx,11
                syscall
                ;Exit
                xor rax,rax
                mov rax,60
                xor rdi,rdi
                syscall
        widen:
                call pHworld
                Hworld db "Hello World",0xa

样本2

global _start
section .text
        _start:
                call pHworld
                Hworld db "Hello World",0xa

        pHworld:
                pop rsi
                xor rax,rax
                mov al,1
                mov rdi,rax
                mov rdx,rdi
                add rdx,11
                syscall
                ;Exit
                xor rax,rax
                mov rax,60
                xor rdi,rdi …

linux assembly x86-64 nasm shellcode

3
推荐指数
1
解决办法
578
查看次数

如何获取没有NUL字节的objdump?

我在汇编中有以下代码:

global _start
section .rodata
  hello: db "Hello World!", 10

section .text

_start:
    mov eax,4           
    mov ebx,1          
    mov ecx,hello       
    mov edx,13     
    int 80h             

    ; Terminate program
    mov eax,1          
    xor ebx,ebx           
    int 80h
Run Code Online (Sandbox Code Playgroud)

如果我使用以下代码的objdump,则会得到:

在此处输入图片说明

如果我在objdump中得到了NUL字符,则将无法完成我正在处理的任务。我如何在没有任何NUL(0x00)字节的情况下获取objdump?

x86 assembly nasm objdump shellcode

3
推荐指数
1
解决办法
90
查看次数