【ctf题目系列】ctfwiki pwn类型 格式化字符串
基础知识
%08x
在C语言中,%08x
是一个格式化字符串,通常用于格式化输出或输入十六进制数字。它的含义如下:
%
:这是格式化字符串的起始标志。0
:表示使用零填充字段,即在数字前面用零填充,以达到指定的字段宽度。8
:表示字段宽度为8个字符,包括填充的零和十六进制数字。x
:表示以十六进制格式输出整数。
因此,%08x
用于以八个字符的宽度,使用零填充的方式输出一个整数的十六进制表示。如果整数的十六进制表示不足8个字符,将在前面用零填充。这种格式通常用于确保输出的十六进制数具有一致的宽度,便于阅读和比较。
1 |
|
在这个示例中,num
是一个整数变量,printf
函数将会将其格式化为一个8个字符宽度的十六进制字符串,并在前面用零填充,然后将结果打印出来。
printf
printf(“%p”,a) 用地址的格式打印变量 a 的值
printf(“%p”, &a) 打印变量 a 所在的地址。
%3$x
在C语言的格式化字符串中,%3$x表示使用参数列表中的第3个参数,并以十六进制格式打印它。这是一种格式化输出的方式,通常在处理多个参数的情况下使用。
%
:格式化字符串的起始标志。3$
:表示使用参数列表中的第3个参数。x
:表示以十六进制格式输出参数的值。
例如,考虑以下代码:
1 |
|
在这个示例中,%3$x将会打印参数列表中的第3个参数 c(它的值是30)的十六进制表示。所以输出将是:
1 |
|
请注意,使用%3$x这样的格式化字符串可以很有用,特别是在处理多个参数的情况下,可以选择性地选择要打印的参数,以及以不同的格式打印它们。
__isoc99_scanf(“%6s”, format);
使用scanf
从输入中读取最多6个字符,并将它们存储在名为format
的变量中。输入将在读取了6个字符或遇到空白字符(例如空格或换行符)时停止。
小技巧总结
- 利用 %x 来获取对应栈的内存,但建议使用 %p,可以不用考虑位数的区别。
- 利用 %s 来获取变量所对应地址的内容,只不过有零截断。
- 利用 %order$x 来获取指定参数的值,利用 %order$s 来获取指定参数对应地址的内容。
【ctf题目系列】ctfwiki pwn类型 格式化字符串
http://example.com/2023/09/01/ctf/【ctf题目系列】ctfwiki pwn类型 格式化字符串/