免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iLRainyday
打印 上一主题 下一主题

这个最基础的注入为什么会出错啊? [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
31 [报告]
发表于 2009-12-15 17:30 |只看该作者

回复 #28 iLRainyday 的帖子

我写那段代码时, 捣鼓了半天, 弄出一对prologue,epilogue 就是为了避免这一句 :
__asm__("sub $0x4,%esp");

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
32 [报告]
发表于 2009-12-15 17:32 |只看该作者

回复 #30 iLRainyday 的帖子

ptr + 1 和 &ptr + 1 是有区别的。

只要ptr 是左值, 无论其类型, &ptr + 1 都是可以的。
而ptr + 1 不一定。

论坛徽章:
0
33 [报告]
发表于 2009-12-15 17:49 |只看该作者
我写那段代码时, 捣鼓了半天, 弄出一对prologue,epilogue 就是为了避免这一句 :
__asm__("sub $0x4,%esp");


我那个是很丑陋笨拙的法子~~你的prologue &epilogue很优雅的,而且我也学习到了如何利用参数在堆栈中进行定位 :)

我之前一直以为对于没有指向类型的void *ptr进行&ptr+1操作时,是简单的指向下一个字节,所以刚开始看你的例子时一直没搞清楚堆栈定位,后来用gdb跟踪了一下才发现这个问题,我一会翻翻那本 C: A reference manual,看看上面有没有解释这个问题。

[ 本帖最后由 iLRainyday 于 2009-12-15 17:53 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2009-12-15 18:30 |只看该作者
找到了一些说法:

在Generic Pointers一节中,“Type void * is considered to be neither an object pointer nor a function pointer"。在Address Operator一节中:”The operand of & must be either a funciton designator or an lvalue designating an object".

所以,如果有void * ptr时,如果进行&ptr,那么“似乎"是将ptr由void *转换成了int *. 实验如下:

int i = 1;
void *ptr;
ptr = &i;
i = *ptr;  --------->报错!
i = *(&ptr);  ----------->没问题!

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
35 [报告]
发表于 2009-12-15 18:48 |只看该作者

回复 #34 iLRainyday 的帖子

关于2级指针,我想, 我在24楼已经解释清楚了。


int i = 1;
void *ptr;
ptr = &i;
i = *ptr;  --------->报错!  当然,ptr是void*, 未知类型指针, 无法解引用。
i = *(&ptr);  ----------->没问题! 这里没问题是这样的:

(&ptr);  该表达式类型是  void**  是一个指针, 指向void* —— 不再是未知类型指针, 指向类型是已知的,void*。
*(&ptr); 所以该表达式可以解引用, 得到的类型是void* , 值就是ptr的值。
i = *(&ptr) ;  这里能通过, 是因为 void* (值是ptr) 被隐式转换为int了。



请教一下:
在Generic Pointers一节中,“Type void * is considered to be neither an object pointer nor a function pointer"

这个说法是在哪找到的? C: A reference manual ?
这个说法和C标准好像有点冲突。

论坛徽章:
0
36 [报告]
发表于 2009-12-15 19:03 |只看该作者
恩~~我似乎明白你的意思了~~

这个说法是在哪找到的? C: A reference manual ?
这个说法和C标准好像有点冲突。


在C: A reference manual一书中,第137页,5.3.2节

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
37 [报告]
发表于 2009-12-15 19:21 |只看该作者

回复 #36 iLRainyday 的帖子

能不能发我一下电子版?  多谢多谢~
或者, 书中在解释void* 可以指向函数时, 有没有说引用了标准哪一段?


印象中, 我没能在标准里找到说void*和函数指针有相同表示。
the c programming language也只是说void* 可以保存任何数据指针, 转换为原来类型不会丢失信息;不同类型的函数指针可以相互转换,转换为原来的类型不丢失信息。 但没有说数据指针和函数指针之间可以相互转换。

我上面的代码也仅仅是针对i386写的, void*, int, void (*)(void) 都是一回事。


而C: A reference manual, 不会仅仅针对i386吧? 所以想查证一下是否void* 可以保存函数指针。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
38 [报告]
发表于 2009-12-15 19:34 |只看该作者

回复 #36 iLRainyday 的帖子

是《C A Reference Manual》?
作者是Samuel P. Harbison III和 Guy L. Steele Jr. ?


就在这一句:
Type void * is considered to be neither an object pointer nor a function pointer.


之前,就是另外一句意思不同的:
...
Any pointer to an object or incomplete type( but not a function type ) can be converted to type void* and back without change.
Type void * is considered to be neither an object pointer nor a function pointer.
...

—— 5.3.1 Generic Pointers, p137 末尾


费解……


补充:我引用的是第5版

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
39 [报告]
发表于 2009-12-15 19:38 |只看该作者

回复 #36 iLRainyday 的帖子

我发现错在哪了……
把neither nor的意思理解反了

论坛徽章:
0
40 [报告]
发表于 2009-12-15 20:44 |只看该作者
就是你说的那本,作者是Samuel P. Harbison III和 Guy L. Steele Jr. 这本书我一直没在网上见到过电子版。我手边是人邮03年出版的影印版(第五版)。

在p140页的5.3.3节最后一句说了: in standard C,void * can be used as a generic object pointer,but there is no generic funciton pointer.
还有一句是:function pointers and data pointers may have significantly differnet representations,including different sizes.

[ 本帖最后由 iLRainyday 于 2009-12-15 20:45 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP