目录
今日目标
继续 narnia 系列。今天的目标是 narnia1。
首先,这个挑战本身很简单,但是可以细想一下背后的原理,还是有一些地方值得挖掘和理解。
这是 narnia1 的源码。
#include <stdio.h>
int main(){
int (*ret)();
if(getenv("EGG")==NULL){
printf("Give me something to execute at the env-variable EGG\n");
exit(1);
}
printf("Trying to execute EGG!\n");
ret = getenv("EGG");
ret();
return 0;
}
源码要求要设置一个名为 EGG
的环境变量,这个环境变量被赋值给变量 ret
,最后程序调用 ret
执行 EGG
中的指令。
narnia 的实现原理都是一样,每一个二进制都设置了 suid
,运行时获得下一个用户的权限,从而能获取下一个用户的密码(回看上一篇)。
可以学到什么?
什么是 Shellcode?
Shellcode,又称 bytecode
,其本质,是机器指令,其表现形式,是机器指令的 16 进制。如下图:
这一段 shellcode 是 execve("/bin/bash", ["/bin/bash", "-p"], NULL)
的机器指令形式。
下面我们看一下 shellcode 是如何