格式化字符串攻击 《转》

翻译:     xuzq@chinasafer.com
内容:
        介绍
        什么是格式化字符串攻击?
        Printf-学校忘记教给你的东西
        简单的例子
        来格式化吧!(Format Me!)
        X MARKS THE SPOT(X是本文示例程序中我们试图重写的一个变量,这句我不知
道如何翻译)
        怎么着(So what)?
摘要
本文讨论格式化字符串漏洞的成因和含义,并给出实际的例子来解释原理。
介绍
我知道在某些时候对于你我和我们大家而言,下面这种情况总会发生。在一个时下流行的
晚餐会上,夹杂在同事们大呼小叫的声音里,你听到了"格式化字符串攻击"这只言片语。
"格式化字符串攻击?什么是格式化字符串攻击?"你心说。由于害怕在同事们面前显露出
自己的无知,你决定停
止不自然的微笑,而频频点头以示自己对这玩艺了如指掌。如果一切顺利,大家会共饮鸡
尾酒,谈话仍将继续,但是没人明白这究竟是怎么回事。现在不用再害怕什么了,本文会
提供你想知道而又不好意思问的所有内容。
什么是格式化字符串攻击?
格式化字符串漏洞同其他许多安全漏洞一样是由于程序员的懒惰造成的。当你正在阅读本
文的时候,也许有个程序员正在编写代码,他的任务是:打印输出一个字符串或者把这个
串拷贝到某缓冲区内。他可以写出如下的代码:
    printf("%s", str);
但是为了节约时间和提高效率,并在源码中少输入6个字节,他会这样写:
    printf(str);
为什么不呢?干嘛要和多余的printf参数打交道,干嘛要花时间分解那些愚蠢的格式?
printf的第一个参数无论如何都会输出的!程序员在不知不觉中打开了一个安全漏洞,可
以让攻击者控制程序的执行,这就是不能偷懒的原因所在。
为什么程序员写的是错误的呢?他传入了一个他想要逐字打印的字符串。实际上该字符串
被printf函数解释为一个格式化字符串(format    

时间: 2024-08-01 13:29:36

格式化字符串攻击 《转》的相关文章

ios-如何格式化字符串变量的数据?

问题描述 如何格式化字符串变量的数据? 在NSString存日期: 1900-01-01T11:00:00 需要进行格式化,然后加了一个格式器: NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"dd/MM/yyyy hh:mm:ss a"]; 如何进行格式化? NSString* formatedDateString = [df ???]; 解决方案 你要创建两个日期格式器.一个用于解析

关于新浪微博API返回的日期格式化字符串

新浪微博返回的时间都是,带有时区的GMT时间,平时使用惯了中国的时间表示格式,GMT时间转换一时无从下手.找了好一会儿,终于找到了对应的时间格式化字符串: Tue May 31 17:46:55 +0800 2011 对应: EEE MMM d HH:mm:ss Z yyyy 都是对应关系,其中的Z应该是Zone,表示时区的意思,对应上面的+0800(北京时间,是东八时区). ios解析补充: 如果你在iOS中解析新浪微博的日期格式,只是设置NSDateFormatter实例的dateForma

编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

原文:编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串.实现浅拷贝和深拷贝.用dynamic来优化反射] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深拷贝 建议15.使用dynamic来简化反射实现 建议13.为类型输出格式化字符串   有两种方法可以为类型提供格式化的字符串输出. 一种是意识到类型会产生格式化字符串输出,于是

python字典的格式化字符串中如果键值是个整数,格式化字符串中的括号内容怎么写?

问题描述 python字典的格式化字符串中如果键值是个整数,格式化字符串中的括号内容怎么写? 比如: test={'3':'hello', 3:99} "%(3)s" % test #输出的是'hello' 那我怎么格式化输出99呢? 解决方案 对于你这种方式,dict只支持字符串形式的key,对于int类型,你可以直接取取 "%d" % test[3] 解决方案二: 字典的格式化字符串字典:格式化字符串python字典的格式化字符串

javascript模拟C#格式化字符串_javascript技巧

JS 模拟C# 字符串格式化操作 /*** ** 功能: 字符串格式化替换操作 ***/ String.prototype.format = function () { var args = arguments; return this.replace(/\{(\d+)\}/g, function (m, i) { return args[i]; }); } js实现类似c#中的字符串处理函数format(): 熟悉c#的应该知道有format()这么一个方法,下面就来模仿一下,在javascr

C#格式化字符串中转义大括号“{}”

原文:C#格式化字符串中转义大括号"{}"  今天,用C#写程序操作Excel,读取单元格内容根据所需格式生成字符串,使用String.Format(string format,object arg0)方法.以前只知"{0}"为索引占位符(即格式项),与参数列表中的第一个对象相对应,格式设置过程将每个格式项替换为对应对象的值的文本表示形式.但这次需将参数对象格式成一对大括号括起来的格式,即返回字符串"{对象arg0的文本表示形式}". [csha

格式化固定长度字符串,格式化字符串里显示百分号

一. 在编程过程中经常需要格式对齐,这就需要把字符串格式成固定长度:     1: C++提供了setiosflags()来设置输出格式,setw(int)设置输出宽度:         cout<<setiosflags(ios::left)               <<setw(10)<<"字段1"               <<setw(10)<<"字段2"               <

Python中用format函数格式化字符串的用法_python

自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱.语法 它通过{}和:来代替%. "映射"示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kzc',18) Out[2]: 'kzc,18' In [3]: '{1},{0},{1}'.for

C# 格式化字符串的实现代码_C#教程

1 前言    如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串类,那么你对String.Format方法肯定很熟悉.在C#中也经常使用这个方法来格式化字符串,比如下面这样: int x = 16; decimal y = 3.57m; string h = String.Format( "item {0}