例如,我想用方法实现类
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)
实现它的最简单方法是什么?
以下程序具有未定义的行为:
#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"等,以确保提供参数指定适当的格式字符串类型,并在格式字符串指定的转换意义
我正在开发一个格式字符串漏洞实验室,我们给出了以下代码:
#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) 我正在接受安全课程,需要我们在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,所以没必要担心这个值太大了.有什么建议?谢谢.
在我的应用程序中,我发现自己经常使用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)
谢谢您的帮助
我正在阅读并尝试学习格式字符串漏洞.我有一个易受攻击的功能,我理解与格式字符串有关的要点.
基本上,这就是我想要做的.传入我的格式字符串,其中包含一些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覆盖特定值.
最近,我注意到一个我想验证的奇怪案例:
通过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 ...
是否可以通过标准,标准草案或某些官方来源进行验证?
使用sprintf和一般语法"%A.B"我可以这样做:
double a = 0.0000005l;
char myNumber[50];
sprintf(myNumber,"%.2lf",a);
Run Code Online (Sandbox Code Playgroud)
我可以在格式字符串中动态设置A和B吗?
printf转换规范%后面是标志,宽度,精度,长度修改器和转换说明符.转换规范的大小是否有实际限制?
即%s2个字符长,而%08.2f6个字符长.我的问题是,根据C99标准,可以创建的格式字符串中的最大单一规范的长度是多少?
我必须通过分析格式化结果来启发式地确定格式模式字符串.
例如,我有这些字符串:
你有3条未读消息.
您有10条未读消息.
对不起,戴夫.我恐怕不能那样做.
对不起,弗兰克.我恐怕不能那样做.
这句话是错误的.
我想导出这些格式字符串:
您有%s条未读邮件
对不起,%s.我恐怕不能那样做.
这句话是错误的.
哪种方法和/或算法可以帮助我?
我的第一个想法是使用机器学习的东西,但我的胆量告诉我这可能是一个相当经典的问题.
一些额外要求:
%s或者%d填充或对齐,我不需要信息.language-agnostic string algorithm pattern-matching format-string
format-string ×10
c ×7
string ×4
security ×3
c99 ×2
gcc ×2
printf ×2
algorithm ×1
exploit ×1
gcc-warning ×1
java ×1
logging ×1
parameters ×1
python ×1
strftime ×1