- 主题:格式串输入的问题
char user[16] = "os %n%n%n %s %d";
incorrect_password(user);
void incorrect_password(const char *user)
{
char foostr[32];
memset(foostr, 0, 32);
sprintf(foostr, "%s\r\n", user); //试验了下这行和下一行都不可少,否则就会导致Segmentation fault
printf("%s", foostr); //直接printf("%s", user);也不行, 这里有个疑问,user已经放在非格式串位置了,为什么还是会异常
}
--
修改:b0207191 FROM 218.66.91.*
FROM 218.66.91.*
要学会提问。
搜索一下「提问+MWE」,学一下什么是最小的可运行的例子。
光从你贴出来的代码片段来看,是没问题的。
也看不懂你说的话。
【 在 b0207191 的大作中提到: 】
: 标 题: 格式串输入的问题
: 发信站: 水木社区 (Tue Jun 6 15:15:10 2023), 站内
:
:
:
: char user[16] = "os %n%n%n %s %d";
:
: incorrect_password(user);
:
:
:
:
:
:
: void incorrect_password(const char *user)
: {
:
: char foostr[32];
: memset(foostr, 0, 32);
: sprintf(foostr, "%s\r\n", user); //试验了下这行和下一行都不可少,否则就会导致Segmentation fault
: printf("%s", foostr); //直接printf("%s", user);也不行, 这里有个疑问,user已经放在非格式串位置了,为什么还是会异常
: }
:
:
: --
:
: ※ 修改:·b0207191 于 Jun 6 15:15:41 2023 修改本文·[FROM: 218.66.91.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.66.91.*]
--
修改:b0207191 FROM 218.66.91.*
FROM 163.125.197.*
不好意思啊,就是说,如果把incorrect_password
改成如下的
incorrect_password1
或者
incorrect_password2
程序就会异常
void incorrect_password1(const char *user)
{
printf("%s", user);
}
void incorrect_password2(const char *user)
{
char foostr[32];
memset(foostr, 0, 32);
sprintf(foostr, "%s\r\n", user);
printf(foostr);
}
cert的建议就是,passes the untrusted user input as one of the variadic arguments to fprintf() and not as part of the format string, eliminating the possibility of a format-string vulnerability:
我的疑问就是incorrect_password2中,已经把user重新按字符串写入到foostr中了,为什么还是不能消除这种风险
【 在 flw 的大作中提到: 】
要学会提问。
搜索一下「提问+MWE」,学一下什么是最小的可运行的例子。
光从你贴出来的代码片段来看,是没问题的。
也看不懂你说的话。
【 在 b0207191 的大作中提到: 】
: 标 题: 格式串输入的问题
: 发信站: 水木社区 (Tue Jun 6 15:15:10 2023), 站内
:
:
:
: char user[16] = "os %n%n%n %s %d";
:
: incorrect_password(user);
:
:
:
:
:
:
: void incorrect_password(const char *user)
: {
:
: char foostr[32];
: memset(foostr, 0, 32);
: sprintf(foostr, "%s\r\n", user); //试验了下这行和下一行都不可少,否则就会导致Segmentation fault
: printf("%s", foostr); //直接printf("%s", user);也不行, 这里有个疑问,user已经放在非格式串位置了,为什么还是会异常
: }
:
:
: --
:
: ※ 修改:·b0207191 于 Jun 6 15:15:41 2023 修改本文·[FROM: 218.66.91.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.66.91.*]
--
修改:b0207191 FROM 218.66.91.*
FROM 218.66.91.*
你看,你这次发的代码和上次就又不一样。
你上次是 printf("%s", user);
这次是 printf(user);
这两是有区别的,你不会不明白吧。
【 在 b0207191 的大作中提到: 】
: 标 题: Re: 格式串输入的问题
: 发信站: 水木社区 (Tue Jun 6 18:34:35 2023), 站内
:
: 不好意思啊,就是说,如果把incorrect_password
: 改成如下的
: incorrect_password1
: 或者
: incorrect_password2
: 程序就会异常
:
: void incorrect_password1(const char *user)
: {
: printf("%s", user);
: }
:
:
: void incorrect_password2(const char *user)
: {
:
: char foostr[32];
: memset(foostr, 0, 32);
: sprintf(foostr, "%s\r\n", user);
: printf(foostr);
: }
:
:
:
: cert的建议就是,passes the untrusted user input as one of the variadic arguments to fprintf() and not as part of the format string, eliminating the possibility of a format-string vulnerability:
:
: 我的疑问就是incorrect_password2中,已经把user重新按字符串写入到foostr中了,为什么还是不能消除这种风险
:
:
:
:
:
:
:
:
: 【 在 flw 的大作中提到: 】
: 要学会提问。
:
: 搜索一下「提问+MWE」,学一下什么是最小的可运行的例子。
:
: 光从你贴出来的代码片段来看,是没问题的。
:
: 也看不懂你说的话。
:
: 【 在 b0207191 的大作中提到: 】
: : 标 题: 格式串输入的问题
: : 发信站: 水木社区 (Tue Jun 6 15:15:10 2023), 站内
: :
: :
: :
: : char user[16] = "os %n%n%n %s %d";
: :
: : incorrect_password(user);
: :
: :
: :
: :
: :
: :
: : void incorrect_password(const char *user)
: : {
: :
: : char foostr[32];
: : memset(foostr, 0, 32);
: : sprintf(foostr, "%s\r\n", user); //试验了下这行和下一行都不可少,否则就会导致Segmentation fault
: : printf("%s", foostr); //直接printf("%s", user);也不行, 这里有个疑问,user已经放在非格式串位置了,为什么还是会异常
: : }
: :
: :
: : --
: :
: : ※ 修改:·b0207191 于 Jun 6 15:15:41 2023 修改本文·[FROM: 218.66.91.*]
: : ※ 来源:·水木社区 mysmth.net·[FROM: 218.66.91.*]
:
: --
:
:
: --
:
: ※ 修改:·b0207191 于 Jun 6 18:44:59 2023 修改本文·[FROM: 218.66.91.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.66.91.*]
--
修改:b0207191 FROM 218.66.91.*
FROM 163.125.197.*
嗯,我一开始弄混了,规则就是不能把不可信的字符串作为xxxprintf的格式串,只能作为可变参数字符串
【 在 flw 的大作中提到: 】
你看,你这次发的代码和上次就又不一样。
你上次是 printf("%s", user);
这次是 printf(user);
这两是有区别的,你不会不明白吧。
【 在 b0207191 的大作中提到: 】
: 标 题: Re: 格式串输入的问题
: 发信站: 水木社区 (Tue Jun 6 18:34:35 2023), 站内
:
: 不好意思啊,就是说,如果把incorrect_password
: 改成如下的
: incorrect_password1
: 或者
: incorrect_password2
: 程序就会异常
:
: void incorrect_password1(const char *user)
: {
: printf("%s", user);
: }
:
:
: void incorrect_password2(const char *user)
: {
:
: char foostr[32];
: memset(foostr, 0, 32);
: sprintf(foostr, "%s\r\n", user);
: printf(foostr);
: }
:
:
:
: cert的建议就是,passes the untrusted user input as one of the variadic arguments to fprintf() and not as part of the format string, eliminating the possibility of a format-string vulnerability:
:
: 我的疑问就是incorrect_password2中,已经把user重新按字符串写入到foostr中了,为什么还是不能消除这种风险
:
:
:
:
:
:
:
:
: 【 在 flw 的大作中提到: 】
: 要学会提问。
:
: 搜索一下「提问+MWE」,学一下什么是最小的可运行的例子。
:
: 光从你贴出来的代码片段来看,是没问题的。
:
: 也看不懂你说的话。
:
: 【 在 b0207191 的大作中提到: 】
: : 标 题: 格式串输入的问题
: : 发信站: 水木社区 (Tue Jun 6 15:15:10 2023), 站内
: :
: :
: :
: : char user[16] = "os %n%n%n %s %d";
: :
: : incorrect_password(user);
: :
: :
: :
: :
: :
: :
: : void incorrect_password(const char *user)
: : {
: :
: : char foostr[32];
: : memset(foostr, 0, 32);
: : sprintf(foostr, "%s\r\n", user); //试验了下这行和下一行都不可少,否则就会导致Segmentation fault
: : printf("%s", foostr); //直接printf("%s", user);也不行, 这里有个疑问,user已经放在非格式串位置了,为什么还是会异常
: : }
: :
: :
: : --
: :
: : ※ 修改:·b0207191 于 Jun 6 15:15:41 2023 修改本文·[FROM: 218.66.91.*]
: : ※ 来源:·水木社区 mysmth.net·[FROM: 218.66.91.*]
:
: --
:
:
: --
:
: ※ 修改:·b0207191 于 Jun 6 18:44:59 2023 修改本文·[FROM: 218.66.91.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 218.66.91.*]
--
修改:b0207191 FROM 218.66.91.*
FROM 218.66.91.*
你只要理解了什么是格式字符串,自然就应该能明白这个道理。
【 在 b0207191 的大作中提到: 】
: 嗯,我一开始弄混了,规则就是不能把不可信的字符串作为xxxprintf的格式串,只能作为可变参数字符串
--
FROM 163.125.197.*