标签: format-string

用"?"格式化字符串的方法 java中的完整字符串参数?

例如,我想用方法实现类

public class Logger {

    public void info(String message, String[] params) {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是输入

new Logger().info("Info: param1 is ? , param2 is ?", new  String[] {"a", "b"});
Run Code Online (Sandbox Code Playgroud)

输出必须是

Info: param1 is a , param2 is b
Run Code Online (Sandbox Code Playgroud)

实现它的最简单方法是什么?

java string parameters logging format-string

10
推荐指数
2
解决办法
3万
查看次数

为什么gcc -Wformat没有在unsigned int上警告printf%d?

以下程序具有未定义的行为:

#include <stdio.h>

int main(void)
{
    unsigned int x = -100; // This is fine, becomes UINT_MAX - 100
    printf("%d\n", x); // This is undefined behavior.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C99 7.19.6.1p8状态%d需要一个int参数.

C99 7.19.6.1p9声明"如果任何参数不是相应转换规范的正确类型,则行为 未定义."

但是,gcc -Wformat(包含在内-Wall)不会抱怨上述程序,为什么?这是一个错误,还是故意遗漏?

从gcc手册页:

-Wformat
Run Code Online (Sandbox Code Playgroud)

检查电话"printf""scanf"等,以确保提供参数指定适当的格式字符串类型,并在格式字符串指定的转换意义

c gcc gcc-warning format-specifiers format-string

9
推荐指数
1
解决办法
2467
查看次数

在格式字符串漏洞攻击中访问数组的第二个元素

我正在开发一个格式字符串漏洞实验室,我们给出了以下代码:

#define SECRET1 0x44
#define SECRET2 0x55

int main(int argc, char *argv[])
{
  char user_input[100];
  int *secret;
  int int_input;
  int a, b, c, d; /* other variables, not used here.*/

  /* The secret value is stored on the heap */
  secret = (int *) malloc(2*sizeof(int));

  /* getting the secret */
  secret[0] = SECRET1; 
  secret[1] = SECRET2;

  printf("The variable secret's address is 0x%.8x (on stack)\n", &secret);
  printf("The variable secret's value is 0x%.8x (on heap)\n", secret);
  printf("secret[0]'s address is 0x%.8x (on heap)\n", …
Run Code Online (Sandbox Code Playgroud)

c security string exploit format-string

9
推荐指数
1
解决办法
2256
查看次数

如何在格式字符串攻击中将值写入地址

我正在接受安全课程,需要我们在unix虚拟机上进行格式化字符串攻击.漏洞是使用命令行参数的格式字符串.

我的问题是如何将值写入格式字符串中的地址(如将shell shell代码写入函数返回地址)?

例如,我尝试将值987654写入返回地址位置0xaabbccdd.我尝试了一些字符串"AAAA_%10$x",这可以导致程序打印AAAA_41414141.

然后我用我的地址替换字母并尝试覆盖它.

\xdd\xcc\xbb\xaa_%10$x_%54321x_%n"
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我看到一篇文章说我应该使用较小的数字,%54321x因为我已经写了一些字符,但我不知道我之前写过多少字符%54321x.

注意:环境有一个旧版本的gcc,所以没必要担心这个值太大了.有什么建议?谢谢.

c security string format-string

8
推荐指数
1
解决办法
7900
查看次数

在哪里保存常见的strftime字符串,如("%d /%m /%Y")

在我的应用程序中,我发现自己经常使用stftime,并且主要使用2种字符串格式 - ("%d /%m /%Y")和("%H:%M")

我不是每次都写字符串,而是希望将这些字符串存储在某些全局变量或其他内容中,因此我可以在我的应用中的一个位置定义格式字符串.

什么是pythonic方式呢?我应该使用全局字典,类,函数还是其他东西?

也许是这样的?

class TimeFormats():
    def __init__(self):
        self.date = "%d/%m/%Y"
        self.time = "%H:%M"
Run Code Online (Sandbox Code Playgroud)

或者像这样?

def hourFormat(item):
    return item.strftime("%H:%M")
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

python global-variables strftime format-string

8
推荐指数
2
解决办法
808
查看次数

格式化字符串并使用%n覆盖具有特定值的内存地址

我正在阅读并尝试学习格式字符串漏洞.我有一个易受攻击的功能,我理解与格式字符串有关的要点.

基本上,这就是我想要做的.传入我的格式字符串,其中包含一些shellcode作为其中的一部分.我还需要格式化我的字符串,以便更换易受攻击函数的返回地址,以便它指向我在堆栈上的shellcode.因此,当函数返回时,它将跳转到堆栈上的shellcode并打开shell.

目前,我正处于可以在堆栈上看到我的shellcode的位置,并且我能够写入返回地址来更改它.问题是,我使用%n作为覆盖返回地址的方式,并且不确定如何使用特定值覆盖%n.当然,%n只是将到目前为止写入的字节数打印到堆栈上的指定地址.我已经阅读了几个关于你如何操纵%n来写出你想要的确切地址/值的东西,但是我对如何做到这一点感到很遗憾.

任何人都能解释一下吗?

编辑:我已经尝试用'%500d"和"%.500d"等内容填充我的格式字符串以及某些n值的"%nu".(我也尝试过更小的值)但是这只是带来了分段错误.

为了澄清一些困惑,这是我在回复评论时写的一个简单例子:

好的,我会试着更清楚一点.我有一个易受攻击的程序.易受攻击的一点是"printf(输入);".我想通过传入格式字符串来利用它.现在,例如,我有一个格式字符串

"\x0c\xde\xbf\xff%08x.%08x.%08x.%08x.%08x.%08x.%n" 
Run Code Online (Sandbox Code Playgroud)

传入易受攻击的函数时,此格式字符串将使用写入的字节数覆盖0xffbfde0c的内存地址.我想找出如何修改该格式字符串,以便我可以通过以某种方式填充在%n之前写入的字节数来使%n覆盖特定值.

c security format-string

7
推荐指数
1
解决办法
6029
查看次数

到目前为止在snprintf中写的字符

最近,我注意到一个我想验证的奇怪案例:

通过SUS,对于%n格式字符串,各自int将被设置为写入到输出的字节量.此外,因为snprintf(dest, 3, "abcd"),dest将指向"ab\0".为什么?因为不要将n(n = 3)个字节写入输出(dest缓冲区).

我推断出代码:

int written;
char dest[3];
snprintf(dest, 3, "abcde%n", &written);
Run Code Online (Sandbox Code Playgroud)

written将被设置为2(从计数中排除的空终止).但是,根据我使用GCC 4.8.1进行的测试,written设置为5.我是否误解了标准?这是一个错误吗?是不确定的行为?

编辑:

@wildplasser说:

...格式字符串中%n的行为可能是未定义的或实现定义的......

...实现必须模拟处理完整的格式字符串(包括%n)...

@par说:

written是5,因为这是在%n遇到的点处写入的字符数.这是正确的行为. snprintf只复制到size字符减去尾随空格...

和:

另一种看待这种情况的方法是,%n如果它最多只处理2个字符就不会遇到,所以可以想象期望written有一个无效的值......

和:

...整个字符串通过printf()规则处理,然后应用max-length ...

是否可以通过标准,标准草案或某些官方来源进行验证?

c gcc c99 format-string

7
推荐指数
2
解决办法
243
查看次数

使用sprintf动态设置精度

使用sprintf和一般语法"%A.B"我可以这样做:

double a = 0.0000005l;
char myNumber[50];
sprintf(myNumber,"%.2lf",a);
Run Code Online (Sandbox Code Playgroud)

我可以在格式字符串中动态设置A和B吗?

c printf format-string

7
推荐指数
1
解决办法
709
查看次数

printf转换规范的大小限制

printf转换规范%后面是标志,宽度,精度,长度修改器和转换说明符.转换规范的大小是否有实际限制?

%s2个字符长,而%08.2f6个字符长.我的问题是,根据C99标准,可以创建的格式字符串中的最大单一规范的长度是多少?

c printf c99 format-string

6
推荐指数
1
解决办法
2322
查看次数

反转sprintf /格式的方法

我必须通过分析格式化结果来启发式地确定格式模式字符串.

例如,我有这些字符串:

你有3条未读消息.

您有10条未读消息.

对不起,戴夫.我恐怕不能那样做.

对不起,弗兰克.我恐怕不能那样做.

这句话是错误的.

我想导出这些格式字符串:

您有%s条未读邮件

对不起,%s.我恐怕不能那样做.

这句话是错误的.

哪种方法和/或算法可以帮助我?

我的第一个想法是使用机器学习的东西,但我的胆量告诉我这可能是一个相当经典的问题.

一些额外要求:

  • 参数的类型是无关紧要的,即如果参数最初是%s或者%d填充或对齐,我不需要信息.
  • 可以有多个参数(或根本没有参数)
  • 通常,数据由数千个格式化字符串组成,但只有数十种格式模式.

language-agnostic string algorithm pattern-matching format-string

6
推荐指数
1
解决办法
702
查看次数