xctf-pwn CGfsb 传送门:https://adworld.xctf.org.cn/task/answer?type=pwnnumber=2grade=0id=5050 (菜鸡面对着pringf发愁)(-_-||)菜鸡了解的printf知识传送门: https://blog.csdn.net/u010517901/article/details/46486341
xctf-pwn CGfsb
传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050
(菜鸡面对着pringf发愁)(-_-||)菜鸡了解的printf知识传送门:
https://blog.csdn.net/u010517901/article/details/46486341
%c:输出字符,配上%n可用于向指定地址写数据。
%d:输出十进制整数,配上%n可用于向指定地址写数据。
%x:输出16进制数据,如%i$x表示要泄漏偏移i处4字节长的16进制数据,%i$lx表示要泄漏偏移i处8字节长的16进制数据,32bit和64bit环境下一样。
%p:输出16进制数据,与%x基本一样,只是附加了前缀0x,在32bit下输出4字节,在64bit下输出8字节,可通过输出字节的长度来判断目标环境是32bit还是64bit。
%s:输出的内容是字符串,即将偏移处指针指向的字符串输出,如%i$s表示输出偏移i处地址所指向的字符串,在32bit和64bit环境下一样,可用于读取GOT表等信息。
%n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100×10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节,%$lln表示写入的地址空间为8字节,在32bit和64bit环境下一样。有时,直接写4字节会导致程序崩溃或等候时间过长,可以通过%$hn或%$hhn来适时调整。
%n是通过格式化字符串漏洞改变程序流程的关键方式,而其他格式化字符串参数可用于读取信息或配合%n写数据。
printf("%2$c,%1$c\n", ‘B‘, ‘A‘); //$表示使用第几个参数,输出A,B printf("%88c%n\n", ‘A‘, buff); //打印88个字符,前面用空格填充, //最后一个是‘A‘,同时*(int *)buff=88。 printf("%1024c%23$hn\n"); //带有攻击性的做法,第01个参数对用%c, //具体是什么不关心,目标是是把第23个参数 //指向的内存的前2个字节赋值为1024。 printf("%*c%hn\n", 0x1234, ‘A‘, buff); //打印0x1234个字符,前面用空格填充, //最后一个是‘A‘,同时*(short *)buff = 0x1234。输出格式