返回信息流一个小作业,题目要求是:
构造格式化输入,使得程序输出buf及str中的字符串。
代码很简单:
#include <string.h>
main(int argc,char ** argv){
char buf[20];
char *str;
strcpy(buf,"0123456789");
str = malloc(20);
strcpy(str,"0123456789");
printf(argv[1]);
}
我是在gcc下弄的。输出buf貌似很简单,运行的时候后面跟个%s就可以了:./bufstr %s
但是怎么才能输出str里的字符串呢?
我曾经尝试一种方法,就是用gdb查看str中字符串的地址(其实也就是buf中字符串的地址,因为两个字符串是一样的,c语言好像就没有再重新为str构造新的string了),然后构造输入直接printf地址的内容,但是不知道怎么构造输入。
或者还有没有其他一些方法呢?
求解答啊!谢谢~
这是一条镜像帖。来源:北邮人论坛 / security / #34297同步于 2012/5/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
格式化字符串输入的问题
wwwppp520
2012/5/14镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 wwwppp520 的大作中提到: 】
: 一个小作业,题目要求是:
: 构造格式化输入,使得程序输出buf及str中的字符串。
: 代码很简单:
: ...................
我也是菜鸟,自己做了一下,也不知道对不对,可以探讨探讨
直接输入%s,就把stack上第一个存储的变量打印出来了,再往下就是储存的其他东西,比如ebp, eip什么的,然后那个str因为是malloc分配的内存,所以在heap里面,那。。应该要打印好多才能出来的吧。。。(然后就纯瞎搞了)。于是打印出来下图所示。
出现了“0123456789”的hex是“303132.。。39”,由于是little endian, 所以顺序是反的。
我还没搞清楚中间打印出来的那些东西是啥,个人认为应该是一些储存的地址,求指教
lz如果想要彻底搞清楚这个问题的话,建议google一下“格式化字符串漏洞”和“函数调用约定”。
编译的时候建议不要进行任何形式的代码优化,不然strcpy会被优化成内联汇编。
另外“str中字符串的地址(其实也就是buf中字符串的地址,因为两个字符串是一样的,c语言好像就没有再重新为str构造新的string了)”这句话我认为是错误的,buf、str和“0123456789”的地址应该是不同的。
希望能够帮到你。
【 在 wwwppp520 的大作中提到: 】
: 一个小作业,题目要求是:
: 构造格式化输入,使得程序输出buf及str中的字符串。
: 代码很简单:
: ...................
地址必须不同吧?str在heap里面,buf在stack里面。。
【 在 RedOcean 的大作中提到: 】
: lz如果想要彻底搞清楚这个问题的话,建议google一下“格式化字符串漏洞”和“函数调用约定”。
: 编译的时候建议不要进行任何形式的代码优化,不然strcpy会被优化成内联汇编。
: 另外“str中字符串的地址(其实也就是buf中字符串的地址,因为两个字符串是一样的,c语言好像就没有再重新为str构造新的string了)”这句话我认为是错误的,buf、str和“0123456789”的地址应该是不同的。
: ...................
我也知道是必须不同,只是想缓和一下和lz对话的语气。。
【 在 stigma 的大作中提到: 】
: 地址必须不同吧?str在heap里面,buf在stack里面。。
【 在 RedOcean 的大作中提到: 】
: lz如果想要彻底搞清楚这个问题的话,建议google一下“格式化字符串漏洞”和“函数调用约定”。
: 编译的时候建议不要进行任何形式的代码优化,不然strcpy会被优化成内联汇编。
: 另外“str中字符串的地址(其实也就是buf中字符串的地址,因为两个字符串是一样的,c语言好像就没有再重新为str构造新的string了)”这句话我认为是错误的,buf、str和“0123456789”的地址应该是不同的。
: ...................
谢谢你的建议!
另:
buf和str的地址是不一样。
我说的是两次strcpy时“0123456789”的地址。
两次memcpy前都从相同的地址取数据,看了下里面的数据就是“0123456789”。
或者是我理解错了?求解答!谢谢!
没错。
两次“0123456789”的地址是相同的,相同的字符串会在编译的时候进行优化。
静态字符串会放在程序的数据区中。
小提示:你可以在命令行参数中多输入几个%s试验一下,看看会出现些什么结果。
【 在 wwwppp520 的大作中提到: 】
: 谢谢你的建议!
: 另:
: buf和str的地址是不一样。
: ...................
【 在 RedOcean 的大作中提到: 】
: 没错。
: 两次“0123456789”的地址是相同的,相同的字符串会在编译的时候进行优化。
: 静态字符串会放在程序的数据区中。
: ...................
你是成功构造了输入能都显示buf和str?
会segment fault
【 在 RedOcean 的大作中提到: 】
: 没错。
: 两次“0123456789”的地址是相同的,相同的字符串会在编译的时候进行优化。
: 静态字符串会放在程序的数据区中。
: ...................