将两个项目元组列表[{1,2},{3,4}]
转换为地图的优雅方法是%{1=>2, 3=>4}
什么?
关键字列表将是微不足道的,但如果我们有任意键怎么办?
作为Lisp的新手,我想知道Lisp语法是否可以"修复"?
有人说Lisp中的语法是它最大的优势之一.我不太明白这一点.
是不是可以用白色空格,新行和缩进的组合替换"明显"的括号?就像在Python中一样?
在我看来,括号是Lisp代码中最常用的字符.我想知道这是否属实 - 但如果是,这不是一个建议,语法中有一些冗余吗?
这个问题有一些简单的答案 - 为什么这么多括号?
例如:
(defun factorial (x)
(if (= x 0)
1
(* x
(factorial (- x 1)))))
Run Code Online (Sandbox Code Playgroud)
为什么不:
defun factorial (x)
if (= x 0)
1
* x
factorial
- x 1
Run Code Online (Sandbox Code Playgroud)
例如,在行尾用括号括起来,并始终在新行上打开它们.只有1是模棱两可的 - 是1还是(1) - 但是我们可以引入一个例外 - 单个令牌不会"被分解".
这可行吗?
编辑:
set-uid和ELF二进制文件的INTERP部分中的相对路径的组合非常危险.
我不太清楚应该如何以及在哪里报告此问题,但在我看来,这似乎是关于linux/glibc中的动态链接如何工作的一般安全问题,所以让我解释一下它是什么:
考虑构建动态链接的二进制文件并在ELF INTERP部分中指定相对路径(使用--dynamic-linker gcc选项),这样您就可以使用动态链接的商业应用程序重新分发自定义glibc版本(不允许您静态链接)反对LGPL glibc,但仍然需要让你的二进制工作跨不同的linux发行版具有不同的glibc版本).
如果你将二进制文件chown到root,并将set-uid标志放在你的二进制文件上,它实际上就变成了rootkit.从其他目录执行它时,允许您替换将以root权限执行的动态链接器可执行文件.
为了演示这一点,请查看以下C代码(issue.c):
#include <stdio.h>
//
// build with:
// gcc -DNAME=\"vulnarable\" -o issue -Wl,--dynamic-linker,.lib64/ld-linux-x86-64.so.2 issue.c
// sudo chown root issue
// sudo chmod u+s issue
// now build some code to be executed with root permissions (we use the same issue.c):
// mkdir -p .lib64/
// gcc -DNAME=\"rootkit\" -o .lib64/ld-linux-x86-64.so.2 --static issue.c
//
int main(int argc, char* argv[])
{
printf("(%s) euid:%d\n", NAME, geteuid());
}
Run Code Online (Sandbox Code Playgroud)
如果你现在像这样执行set-uid二进制文件
./issue
Run Code Online (Sandbox Code Playgroud)
甚至只是这样做
ldd issue
Run Code Online (Sandbox Code Playgroud)
而不是得到你可能期望的,例如:
(vulnarable) euid:0
Run Code Online (Sandbox Code Playgroud)
你得到:
(rootkit) …
Run Code Online (Sandbox Code Playgroud)