可以"%。70s"在scanf格式字符串导致意外行为?

时间:2016-02-01 18:49:33

标签: c gcc scanf

我刚刚在一个容易受到攻击的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中的内容。

1 个答案:

答案 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 已修改为将其空字符更改为其他内容。