我刚刚在一个容易受到攻击的C程序中遇到了这段令人困惑的代码:
sscanf(user_input, "FOO;%.70s", buf);
此格式字符串有效吗?我试着用它解析一些东西(即把东西读成buf
,但它没有用:
#include <string.h>
#include <stdio.h>
int main() {
char buf[100];
memset(buf, 0x41, sizeof buf);
// output: "FOO;asdasd\n"
printf("FOO;%.70s\n", "asdasd");
sscanf("FOO;asdasd", "FOO;%.70s", buf);
// output: 41 41 41 41 41 41 41 41 41 41
for (int i = 0; i< 10; ++i)
printf("%02x ", buf[i]);
puts("");
}
我的主要问题是,如果我真的可以使用它将数据读入buf
,甚至可能超过70个字节?
但是,如果这是未定义的行为,在使用现代GCC编译和运行用户输入时,它是否会以某种方式直接导致内存损坏?
澄清:我知道"FOO;%70s"
可行。但这根本不是问题。我不能修改这个程序。它是一个setuid二进制文件,我想利用它作为战争游戏的一部分来升级Linux机器上的权限。所以我需要完全理解它的作用,特别是我是否可以通过buf
语句阅读sscanf
中的内容。
答案 0 :(得分:6)
{C}中未将'.'
定义为*scanf()
说明符的一部分。结果就是UB。
如果转换规范无效,则行为未定义C11“7.21.6.2
fscanf
函数”§7.21.6.213
“如果这是未定义的行为,在使用现代GCC编译和运行时,它是否会以某种方式导致内存损坏?”
也许。我在GCC中没有找到任何指定'.'
会发生什么的内容。虽然意外的说明者可能不会根据经验造成很大的伤害,但没有理由依赖它。
[OP后来添加]
“所以我需要完全理解它的作用,特别是我是否可以通过这个sscanf语句读取buf中的内容。”
'.'
的存在会使说明符无效。因此,70
中的"%.70s"
在限制输入方面具有可疑价值。因此,代码可能就像"%s"
那样,gets()
并不比"FOO;asdasd"
更好,并且可能导致过多的输入和缓冲区溢出。示例Sub Macro1()
Dim lastRow as integer 'We need a variable to store the row number in.
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+v
'
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:= _
True
'Let's assume this first part works correctly, since your question does not address this.
'However - Keep in mind that the text to columns have a destination that will always be A1 in your example.
lastRow = Sheets("Bags").Range("A65535").end(xlUp).Row 'Determine the last row in column A that has a value in it.
Sheets("Bags").Range("D2:J" & lastRow).Select 'Select only the rows that have values in column A.
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
已修改为将其空字符更改为其他内容。