我目前正在尝试注入将helloworld打印到易受攻击的程序中的代码。通过将代码存储在其中一个环境变量中并覆盖rip寄存器以指向该代码,我成功地注入了代码。 这是我的汇编和操作码:
0000000000000000 <_start>:
0: eb 17 jmp 19 <stack_setup>
0000000000000002 <execute>:
2: 48 31 c0 xor %rax,%rax
5: b0 01 mov $0x1,%al
7: 48 31 ff xor %rdi,%rdi
a: 48 ff c7 inc %rdi
d: 5e pop %rsi
e: b2 0f mov $0xf,%dl
10: 0f 05 syscall
12: b0 3c mov $0x3c,%al
14: 48 ff cf dec %rdi
17: 0f 05 syscall
0000000000000019 <stack_setup>:
19: e8 e4 ff ff ff callq 2 <execute>
1e: 48 rex.W
1f: 65 gs
20: 6c insb (%dx),%es:(%rdi)
21: 6c insb (%dx),%es:(%rdi)
22: 6f outsl %ds:(%rsi),(%dx)
23: 2c 20 sub $0x20,%al
25: 77 6f ja 96 <stack_setup+0x7d>
27: 72 6c jb 95 <stack_setup+0x7c>
29: 64 21 0a and %ecx,%fs:(%rdx)
2c: 0d .byte 0xd
第19行之后的操作码用于指令db&#34; Hello,world!&#34;,0x0a,0x0d。在用gdb检查x2-x10行中的指令执行后,我注意到它正确地准备了打印字符串Hello,World的参数。但是,在执行syscall语句时,没有任何反应。对于来自x12 - x17行的指令也是如此。
我还尝试编译并链接汇编代码以独立执行它并且它正常工作。除此之外,我还使用选项
编译了易受攻击的程序 -fno-stack-protector -z execstack
这样我就可以运行位于堆栈中的代码了。我也禁用了randomizing_va_space。我想问一下,为了让我成功执行我注入的代码,是否有一些我没做的事情?
答案 0 :(得分:4)
原因可能是write
系统调用返回错误代码。这可能有很多原因,但可能rdx
并非都是零,所以在加载15之前你应该xor %rdx, %rdx
(实际上你应该只加载14,"Hello, World!\n"
)。
无论如何,来自write
的错误将在rax
中返回,并且为负数(-errno
),因此当您执行
mov $0x3c,%al
dec %rdi
syscall
这将是一个无效的系统调用,errno
的{{1}} 38将被返回。
ENOSYS
无论如何,我做了
exit
我建议您使用xor %rax, %rax
mov $0x3c,%al
syscall
运行该程序,并从其输出中查看为什么strace
确实失败。
以下是适用于我的shell代码版本:
write