格式化字符串漏洞学习

一些小技巧和知识:


image.png

image.png

image.png

计算偏移量:
找漏洞函数printf家族,在printf(s)中下断点,然后输入AAAA,在gdb中计算偏移量:
p/d (0xbbbb-0xaaaa)/4
新姿势之替换got表的真实地址:
payload = fmtstr_payload(offset ,{xxx_got:system_addr})
新姿势之任意写:payload = p32(magic_bss) + '%214c' + %7n,'%214c'的作用是输出214个字符,加上前面的地址4位,刚好是218。 新姿势之泄露内存内容:payload = p32(system_got) + "% offset x"(泄露真实地址)
%A$n,是把栈地址的内容进行修改,如果内容是地址,就改这个内容地址里面的东西

image.png

练习题:LAB7:
按照惯例分析一波,checksec,拖进ida分析:
image.png

image.png

开启栈溢出保护,但是有格式化字符串漏洞可以用。
分析逻辑大概可以知道是输入名字和密码,正确的密码是文件中的随机数,先从文件中读取出来放到password里面,自己输入的密码则放在栈的ntpr中,然后进行比较,很明显是printf的格式化字符串漏洞,介绍两种方法:第一种找到password的地址直接修改password的值为1,第二种直接泄露出password的随机值:
即可构造payload:
image.png

image.png

因为我们泄露的随机数可能 大于4位,而我们泄露的只到4位,所以有时成功不了~但是方法一是绝对可以的。
练习题LAB8:
还是按照套路和逻辑来,栈溢出保护,格式化字符串漏洞~
image.png

image.png

接下来分析逻辑:
image.png

很清晰的逻辑,要么修改magic的值,要么直接调用system函数。
在printf那里下断点,计算出偏移量为7,直接上payload:
image.png

image.png

练习题LAB9:
逻辑一样,checksec,再拖进去ida分析:

image.png

image.png

发现是在bss段
由于第一次遇见在bss段中,所以无法直接利用格式化字符串漏洞向栈中写入数据,只能利用间接地写入,在printf那里下一个断点,找到ebp的地址,作为每一次返回的使用:
image.png

来进行构造:
这里有用的就是这四条,分别是设置为ebp1、fmt7、ebp2、fmt11,而他们相对于格式化字符串的偏移分别是6、7、10、11(直接数),思路如下:
1.通过ebp_1使ebp_2指向fmt_7
2.通过ebp_2将fmt_7处的内容覆盖成printf_got
3.通过ebp_1使ebp_2指向fmt_11
4.通过ebp_2将fmt_11处的内容修改成printf_got+2
5.通过fmt_7将printf_got地址泄露出来
6.计算出system函数的地址 ,将system函数地址写入printf在got表的地址
具体做法是将 system函数地址的前两个字节写入fmt_7,后两个字节写入 fmt_11
7.执行printf函数相当于执行system函数
8.输入"/bin/sh"字符串,让system函数从栈中取参数getshell
我们一步一步地分析思路,首先%数字
n,是把栈地址的内容进行修改(写入数据),如果内容是地址,就改这个内容地址里面的东西,所以第一步,因为ebp1存的是ebp2的地址,所以要改的是ebp2地址里面的内容,发现是某一个地址,把它改成fmt7地址,所以ebp2地址里面的内容变成了fmt7的地址,第二步,覆盖printf_got,ebp2的内容是fmt7地址,所以要修改的是fmt7地址里面的内容,所以fmt7地址里面的内容变成了printf_got,第三步和第四步类似,因为是%N
hn,写入2个字节,所以printf_got+2,这样就实现了泄露printf_got表真实地址,然后借此计算出system函数的真实地址,再分别写入2个地址,就相当于执行system函数,输入/bin/sh即可。具体payload:
image.png

image.png

image.png

image.png

在这里解释下那个str(printf_got&0xffff)操作,是获得低位的两个字节,(高位是不变的情况下),例如原操作数是printf_got=0x12345678,那么printf_got&0xffff=0x5678,

image.png

这里是因为%A
n是按照累加去计数的,所以要减去之前的,才是正确的计算。还有那个while True循环,是为了确认字符全部写入,因为一次只能接受0x1000个字符,所以相当于设置了一个标志位,确保能输入完成,然后因为是%N
hn,双字节写入,所以printf_got要加2,其实是类似的,把printf_got表地址写入到两个地方,第一次借助fmt7写入低位的2个字节,第二次是借助fmt11写入高位的2个字节,从而写入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 : 很明显的格式化字符串漏洞 检查一下可执行程序的保护类型 程序没有开启 PIE 保护 , 那么也就是说程序...
    王一航阅读 11,981评论 14 22
  • 格式化字符串漏洞网上讲的也很多,这里就不对漏洞进行解释了,直接讲怎么做题,以湖湘杯的pwn200为例子: 拿到题目...
    2mpossible阅读 4,489评论 0 1
  • A: 今日要把曾经开设的公司转出去。 M: 本不想说太多,但是想想毕竟还是一些生命。那就祝福吧。也提醒吧。 B: ...
    三回头阅读 1,189评论 0 0
  • 我愿赋诗歌,低声细细哦。 心思浮水叶,臆想露池荷。 驾舸白云缓,乘风碧日和。 相知谁与伴,试问可同舶?
    糊涂印象阅读 3,030评论 0 0
  • 《做一个刚刚好的女子》是一部女性话题书,书中涉及到的四十三个话题,涵盖了恋爱、婚姻、家庭、事业等诸多方面,是一本经...
    赖雄伟阅读 5,327评论 9 7