shellcode中的打印问题?

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中的标准输出流有问题?还是别的

回答:

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

问题有两个,一个是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

是我智障了 =。=

以上是 shellcode中的打印问题? 的全部内容, 来源链接: utcz.com/p/195632.html

回到顶部