Tat*_*tat 6 memory security programming-languages
是否有任何真正的低级编程语言可以直接访问内存变量?例如,如果我有一个程序有一个变量i
.任何人都可以访问内存以将我的程序变量更改i
为其他值吗?
作为如何从"外部"更改程序中的变量的示例,请考虑使用调试器.示例程序:
$ cat print_i.c
#include <stdio.h>
#include <unistd.h>
int main (void) {
int i = 42;
for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
return 0;
}
$ gcc -g -o print_i print_i.c
$ ./print_i
i = 42
i = 42
i = 42
…
Run Code Online (Sandbox Code Playgroud)
(程序打印i
每3秒的值.)
在另一个终端中,找到正在运行的程序的进程ID并将gdb
调试器附加到它:
$ ps | grep print_i
1779 p1 S+ 0:00.01 ./print_i
$ gdb print_i 1779
…
(gdb) bt
#0 0x90040df8 in mach_wait_until ()
#1 0x90040bc4 in nanosleep ()
#2 0x900409f0 in sleep ()
#3 0x00002b8c in main () at print_i.c:6
(gdb) up 3
#3 0x00002b8c in main () at print_i.c:6
6 for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
(gdb) set variable i = 666
(gdb) continue
Run Code Online (Sandbox Code Playgroud)
现在程序的输出发生了变化:
…
i = 42
i = 42
i = 666
Run Code Online (Sandbox Code Playgroud)
所以,是的,如果您有权访问其内存,则可以从"外部"更改程序的变量.这里有很多警告,例如,需要找到存储变量的位置和方式.这很简单,因为我用调试符号编译了程序.对于任意语言的任意程序来说,它要困难得多,但理论上仍然可行.当然,如果我不是正在运行的进程的所有者,那么一个表现良好的操作系统将不允许我访问它的内存(没有"黑客"),但这是另一个问题.
归档时间: |
|
查看次数: |
203 次 |
最近记录: |