PWN-格式化字符串漏洞-攻防世界CGfsb
格式化漏洞主要利用以下几种形式:
总结:
栈上存有123数据,%d,%u,%x,%p就是打印栈上的内容,也就是123,而%s就是打印栈内容上123对应的地址,其对应的地址上所保留的数据
例如(32位程序):
0x111 -> a 0xa->233
0x112 -> b 0x???->???
0x113 -> c 0x???->???
前四个就是打印栈上内容a,b,c %s就是打印233
格式化字符串漏洞关键:找到字符串偏移量
调用printf函数的过程:
mov eax,数组首地址
push eax
call printf
栈情况:
题目分析:
看保护知道栈溢出是八行的啦
反汇编后很明显是格式化字符串漏洞,printf(&s)这种写法非常致命的,此题需要让全局变量pwnme变成8才可以
首先找偏移量:AAAA对应0x41414141,偏移量为10
因为没有开启PIE保护,全局变量的地址是不变的,查看是0x804A068
EXP:
当时困惑为什么payload要加上全局变量地址,后面理解了上图原理后,原来printf函数调用的时候会把数组的首地址压栈,因此写入的字符串前面得是四个字节的有效地址,否则会报错如下:
要想改变pwnme全局变量就得先找到pwnme所属的空间的首地址,通过printf固定的偏移量和格式化漏洞来修改pwnme的值
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.