-
-
[原创]WarGame-behemoth6 解题思路
-
发表于: 2019-9-22 16:07 8049
-
Behemoth6_reader伪代码如下
这次的游戏有两个文件,behemoth6会执行behemoth6_reader,在reader中之所以判断0xb是因为这次的挑战并不想直接通过调用execve(/bin/sh)的方式完成,所以需要手动写一个能够打印’HelloKitty’的shellcode,代码如下
这里相当于调用了两个syscall,至于如何传参我已经在番外篇讲过了:
1、 sys_write(int fd, const void *buf, size_t count);
fd:这里用stdout也就是1
*buf:这里是需要打印的数据
count:这里是需要打印数据的长度
2、 sys_exit(int status);
status:不知道啥作用,我传的是exit(1)
这里还需要注意reader打开的是当前的工作目录,并不是’.’目录所以只需要在/tmp文件夹中创建自己的工作目录然后把shellcode.txt放进去,然后直接启动behemoth6就可以了, 执行结果如下
Behemoth6伪代码如下
int __cdecl main(int argc, const char **argv, const char **envp) { void *ptr; // ST14_4@4 __uid_t v4; // ebx@5 __uid_t v5; // eax@5 FILE *stream; // [sp+4h] [bp-Ch]@1 stream = popen("/behemoth/behemoth6_reader", "r"); if ( !stream ) { puts("Failed to create pipe."); exit(0); } ptr = malloc(0xAu); fread(ptr, 0xAu, 1u, stream); pclose(stream); if ( !strcmp((const char *)ptr, "HelloKitty") ) { puts("Correct."); v4 = geteuid(); v5 = geteuid(); setreuid(v5, v4); execl("/bin/sh", "sh", 0); } else { puts("Incorrect output."); } return 0; }
int __cdecl main(int argc, const char **argv, const char **envp) { void *ptr; // ST14_4@4 __uid_t v4; // ebx@5 __uid_t v5; // eax@5 FILE *stream; // [sp+4h] [bp-Ch]@1 stream = popen("/behemoth/behemoth6_reader", "r"); if ( !stream ) { puts("Failed to create pipe."); exit(0); } ptr = malloc(0xAu); fread(ptr, 0xAu, 1u, stream); pclose(stream); if ( !strcmp((const char *)ptr, "HelloKitty") ) { puts("Correct."); v4 = geteuid(); v5 = geteuid(); setreuid(v5, v4); execl("/bin/sh", "sh", 0); } else { puts("Incorrect output."); } return 0; }
Behemoth6_reader伪代码如下
int __cdecl main(int argc, const char **argv, const char **envp) { void *ptr; // [sp+10h] [bp-18h]@3 __int32 size; // [sp+14h] [bp-14h]@3 FILE *stream; // [sp+18h] [bp-10h]@1 __int32 i; // [sp+1Ch] [bp-Ch]@3 stream = fopen("shellcode.txt", "r"); if ( stream ) { fseek(stream, 0, 2); size = ftell(stream); rewind(stream); ptr = malloc(size); fread(ptr, size, 1u, stream); fclose(stream); for ( i = 0; i < size; ++i ) { if ( *((_BYTE *)ptr + i) == 11 ) { puts("Write your own shellcode."); exit(1); } } ((void (*)(void))ptr)(); } else { puts("Couldn't open shellcode.txt!"); } return 0; }
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
谁下载
无
谁下载
无
看原图
赞赏
雪币:
留言: