首先看下保护
放IDA里面分析一下:
看下init
init函数初始化同时将flag读入main的栈帧上。看下padded_work
给了两次wrap printf的格式化字符串利用机会。
过滤函数过滤掉了$符号,将其替换为了空格,一定程度上影响格式化字符串利用。
攻击思路:
1、程序主要是自己给了一个wrap_printf,在原始的格式化字符串上禁用了$符号
2、程序在初始化的时候将flag读到了栈上,但是在很高的地址,直接泄露难以做到。
3、使用多个%p泄露栈地址,得到其中跟flag位置具有固定偏移的地址(exp中的victim
4、第二次输入时将victim地址作为字符串一部分放到栈上去,再计算好偏移使用%s泄露。
【注意】
1、第二次输入的时候victim地址要和前面的字符串使用\0隔开,否则地址会被当做字符串数据输出
2、填充%p的时候注意栈上的0x8对齐
完整攻击脚本:
攻击结果:
By Del0n1x
Keyboard