【ctf题目系列】ctfwiki pwn类型 格式化字符串

ctfwiki-格式化字符串-总入口

基础知识

%08x

在C语言中,%08x是一个格式化字符串,通常用于格式化输出或输入十六进制数字。它的含义如下:

  • %:这是格式化字符串的起始标志。
  • 0:表示使用零填充字段,即在数字前面用零填充,以达到指定的字段宽度。
  • 8:表示字段宽度为8个字符,包括填充的零和十六进制数字。
  • x:表示以十六进制格式输出整数。

因此,%08x用于以八个字符的宽度,使用零填充的方式输出一个整数的十六进制表示。如果整数的十六进制表示不足8个字符,将在前面用零填充。这种格式通常用于确保输出的十六进制数具有一致的宽度,便于阅读和比较。

1
2
int num = 42; // 假设你有一个整数
printf("%08x", num); // 打印整数num的十六进制表示,确保宽度为8个字符

在这个示例中,num是一个整数变量,printf函数将会将其格式化为一个8个字符宽度的十六进制字符串,并在前面用零填充,然后将结果打印出来。

printf

printf(“%p”,a) 用地址的格式打印变量 a 的值
printf(“%p”, &a) 打印变量 a 所在的地址。

%3$x

在C语言的格式化字符串中,%3$x表示使用参数列表中的第3个参数,并以十六进制格式打印它。这是一种格式化输出的方式,通常在处理多个参数的情况下使用。

  • %:格式化字符串的起始标志。
  • 3$:表示使用参数列表中的第3个参数。
  • x:表示以十六进制格式输出参数的值。

例如,考虑以下代码:

1
2
3
4
int a = 10;
int b = 20;
int c = 30;
printf("%3$x\n", a, b, c);

在这个示例中,%3$x将会打印参数列表中的第3个参数 c(它的值是30)的十六进制表示。所以输出将是:

1
1e

请注意,使用%3$x这样的格式化字符串可以很有用,特别是在处理多个参数的情况下,可以选择性地选择要打印的参数,以及以不同的格式打印它们。

__isoc99_scanf(“%6s”, format);

使用scanf从输入中读取最多6个字符,并将它们存储在名为format的变量中。输入将在读取了6个字符或遇到空白字符(例如空格或换行符)时停止。

小技巧总结

  1. 利用 %x 来获取对应栈的内存,但建议使用 %p,可以不用考虑位数的区别。
  2. 利用 %s 来获取变量所对应地址的内容,只不过有零截断。
  3. 利用 %order$x 来获取指定参数的值,利用 %order$s 来获取指定参数对应地址的内容。

【ctf题目系列】ctfwiki pwn类型 格式化字符串
http://example.com/2023/09/01/ctf/【ctf题目系列】ctfwiki pwn类型 格式化字符串/
作者
ningan123
发布于
2023年9月1日
许可协议