shellcode中的打印问题?

发布于 2022-09-04 18:28:26 字数 1392 浏览 17 评论 0

64位linux(ubuntu)
一个简单的汇编程序:test.asm (调用write打印"/bin/sh",然后退出):

global _start:
_start:
    jmp what
are:
    mov rbx,0x68732f6e69622fff
    shr rbx,0x8
    push rbx
    mov rsi,rsp
    mov dl,0x8
    xor rax,rax
    mov al,1
    syscall
    xor rax,rax
    mov al,0x3c
    syscall
what:
    call are

编译后运行是没问题的:

nasm -f elf64 test.asm
ld -o test test.o

但是提取shellcode后直接用c运行却没有打印,gdb进去看也是运行了shellcode,但是就是没有打印:

test.c :

 

unsigned char shellcode[] = "\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe6\xb2\x08\x48\x31\xc0\xb0\x01\x0f\x05\x48\x31\xc0\xb0\x3c\x0f\x05"

int main(){
    ( (void (*)(void))&shellcode )();
    return 0;
}

编译通过

gcc -fno-stack-protector -z execstack -o test2 test.c

运行就是没打印


gdb 调试截图

图片描述

图片描述

图片描述

可以看到系统调用是成功的,并且调用exit是成功推出了,但是就是没打印

是不是shellcode中的标准输出流有问题?还是别的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

み零 2022-09-11 18:28:26

恩,问题找到了,是我智障了,汇编代码太多,只是把问题的一部分截取出来,看昏了,坐下来吃个布丁,看看就明白了。。。。

问题有两个,一个是rdi没致1(stdout),第二个是rdx没清空就赋值

所以应该是这样的:

global _start:
_start:
    jmp what
are:
    mov rbx,0x68732f6e69622fff
    shr rbx,0x8
    push rbx
    mov rsi,rsp
    xor rdx,rdx
    mov dl,0x8
    xor rdi,rdi
    mov dil,1
    xor rax,rax
    mov al,1
    syscall
    xor rax,rax
    mov al,0x3c
    syscall
what:
    call are

这里为了防止截断,rdi和rdx都是用的低位寄存器

shellcode应该是这样的:

somnus@somnus:~/Project/asm$ ./../shell/xer.sh test are what

\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe6\x48\x31\xd2\xb2\x08\x48\x31\xff\x40\xb7\x01\x48\x31\xc0\xb0\x01\x0f\x05\x48\x31\xc0\xb0\x3c\x0f\x05

是我智障了 =。=

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文