Rook1e

  • 安全萌新 / 知道创宇 404 实验室
  • 喜欢开发一些小东西,有很多想学的,日常爱好是云吸猫

初探 Golang 代码混淆

本文首发于 seebug paper:https://paper.seebug.org/1586/ 近年来 Golang 热度飙升,得益于其性能优异、开发效率高、跨平台等特性,被广泛应用在开发领域。在享受 Golang 带来便利的同时,如何保护代码、提高逆向破解难度也是开发者们需要思考的问题。 由于 Golang 的反射等机制,需要将文件路径、函数名等大量信息打包进二进制文件,这部分信息无法被 strip,所以考虑通过混淆代码的方式提高逆向难度。 本文主要通过分析 burrowers/garble 项目的实现来探索 Golang 代码混淆技术,因为相关资料较少,本文大部分内容是通过阅读源码来分析的,如有错误请师傅们在评论区或邮件指正。 前置知识 编译过程 Go 的编译过程可以抽象为: 词法分析:将字符序列转换为 token 序列 语法分析:解析 token 成 AST 类型检查 生成中间代码 生成机器码 本文不展开编译原理的内容,详细内容推荐阅读 Go 语言设计与实现 #编译原理 和 Introduction to the Go compiler。 下面我们从源码角度更直观的探索编译的过程。go build 的实现在 src/cmd/go/internal/work/build.go,忽略设置编译器类型、环境信息等处理,我们只关注最核心的部分: func runBuild(ctx context.Context, cmd *base.Command, args []string) { ... var b Builder ... pkgs := load.PackagesAndErrors(ctx, args) ... a := &Action{Mode: "go build"} for _, p := range pkgs { a....

2021-05-19 · 8 分钟 · rook1e

「SF」子域名搜集工具开发小结

SF 是一个 Golang 开发的高性能的子域名搜集工具,支持字典爆破等搜集方式。项目地址:github.com/0x2E/sf 开发过程中学习了很多文章(见文末),感谢师傅们的分享,于是我也把遇到的几个有意思的点整理了出来。 字典爆破 简易版 net 库提供的 lookup 系列函数不能指定 DNS 服务器,所以用了 miekg/dns,调用起来很简单: func lookup(domain string, resolver string, retry int) string { m := new(dns.Msg) m.SetQuestion(domain, dns.TypeA) // 默认要求递归 var r *dns.Msg var err error for i := 0; i <= retry; i++ { r, err = dns.Exchange(m, resolver) // 默认2秒超时 if err == nil { break } } if err != nil { // 重试之后仍有错误 fmt.Print("lookup error: " + domain + " - " + err....

2021-03-11 · 2 分钟 · rook1e

2020 年终总结

说起来其实今年的生活很单调,大部分时间都在考研,而且又是一次失败的考研,不过失败的事情总结起来更有意义。 毕业 前半年在写毕业设计,薄弱的工程能力和设计能力给自己挖了不少坑,好在最后得了个优秀论文,聊胜于无。 因为疫情不能返校,毕业计划都被打乱了,还想去吃食堂的馄饨和biangbiang面,新老校区交界的安徽板面,后门的杨国福、鸡鱼煲,还有火锅烧烤等等,写到这里又饿了。 寄宿考研 21 年更新:差 5 分没能进复试,老倒霉蛋了。学生时代就这样突然结束,想想还有些舍不得。 正式复习是从七月中旬开始的。因为在家学习效率很低,所以报了一个省内的寄宿考研。有一个固定的(虽然我连续换了三次)自习室位置,平时就是宿舍-自习室-食堂/取外卖三点一线,三个地方在物理上是一条直线,一天的运动量大概在一千步以内,白天吹着空调学习,晚上吹着空调睡觉。听起来很枯燥,但我觉得还行,这种没有变化的生活是我最喜欢的学习情境。唯一不爽的是宿舍楼的卫生,宿舍是跟某学校的学生住在一起的,具体情况不便描述,我只能说那厕所半年逼走了三个保洁。 复习上出现了许多问题:时间安排不合理;数学学习方向错误;英语裸考翻车;拖延;考前心态失控。其实大部分在去年就暴露了,可惜我没有足够重视。 即便是二战生,从七月份正式开始也属实有些晚了,尤其对于我这种做题改题龟速的人来说,五个月不足以吃透数一和 408,所以后期时间相当紧张,数学大多数题目都没来得及二刷,尤其是前期特意标记了的错题。 从去年开始数一改变了命题方向,只会做套路题不懂背后思想、推导过程的学习是得不到分数的,没有重视这个变化是我再次白给的主要原因。即使大部分备考时间都分给了数学,也只是往年真题做得自我满足。用 2020 做最后模拟的时候,突然惊醒,但也已经来不及弥补。可能我的心态就是从那时开始失控的吧。 政治英语一贯裸考,今年甚至连肖四肖八也没怎么做(没时间),好在肖神发挥神勇。可惜英语翻车了。 我自诩是一个大心脏的人,考试面试从来不紧张,唯独这次心态爆炸。最后一个星期靠复方氨酚软胺片顶住鼻炎和感冒,但考试的时候还是精神不佳,每科的前一个小时脑子基本是不转的。好在没发烧,不然考场都进不去。当然这不是考不好的主要原因,也不应该作为借口,有些题本应练成肌肉记忆的。 二战的失败不至于击倒我,反而让我更清楚地认识自己。两年的考研经历也留下了不少遗产:找回了计算能力,补习了计算机基础知识,重新意识到系统型学习的重要性。 也挺好的,人生的每段经历都很有意义。 生活 上半年在家胖了好多,可惜去寄宿基地没办法保持住。吃的最多的是附近的水饺和杨国福,油太多吃完就犯困。 一如既往的晚睡和不正经吃早餐,0:30 后入睡成了日常,后来把手机放在桌子上,才有所好转。要改要改要改。 其他 Notion 五月份开始从语雀转移到了 Notion,然后它就变成了我的笔记、规划、TODO、资料归档等 all in one 的工具,今年涉及到敲字的工作都是在 Notion 上完成的。 RSS 考研期间不敢多玩,日常就逛一逛推特、微博、v2ex、先知,时间长了就觉得这种获取有效信息得方式太过低效,这种碎片式的内容更适合被动获取。于是全部改成了 RSS 订阅,推特的订阅用 RSShub 做中转。利用 Slack 分频道添加 RSS 源,非常方便。 推特没什么用就注销了,然后用一个 Telegram Channel 汇总日常的动态。

2020-12-28 · 1 分钟 · rook1e

Code-Breaking 2020 Bashinj

前天 P 神更新了 Code-Breaking 2020 的第一道题 bashinj ,小密圈里也有师傅放出 wp 了,趁热学习一下。 前置知识 #!/bin/bash source ./_dep/web.cgi echo_headers name=${_GET["name"]} [[ $name == "" ]] && name='Bob' curl -v http://httpbin.org/get?name=$name 题目起源于 4 月 16 日 P 神在小密圈分享的一篇帖子,主要内容是: 原文:https://t.zsxq.com/NfauNNv Bash 语言本身就是执行命令的媒介,但代码注入漏洞的核心原理是相同的,需要一个执行“代码”或“命令”的方法可控,而不是控制一个静态的语法结构中的参数。 上述 example 代码中的 curl,你可以理解为一个“函数”,这里的场景仅仅是函数的参数部分可控,所以不存在代码注入漏洞。 文中提到了对代码注入的一个误区,比如本题中的 curl -v http://httpbin.org/get?name=$name ,第一反应是用 &&id 的方式拼接执行自己想要的命令,其实是错误的。看完帖子似懂非懂,下面做一个实验来更好的理解。 $ export aaa="&&id" # 测试1 $ echo "test 1"$aaa # 测试2 $ eval echo "test 2"$aaa 结果如上图。在测试 1 中,$aaa 的值是作为 echo 函数的参数进行处理的,而不是与 echo 同等地位的 bash 命令。在测试 2 中,$aaa 的值与 echo "test 2" 拼接后作为 eval 的参数,也就是 eval "echo test 2 && id" ,这才是我们所设想的命令拼接的情况。...

2020-04-19 · 2 分钟 · rook1e

浅谈 HTTP 请求走私

本文首发于先知社区:https://xz.aliyun.com/t/7501 漏洞成因 keep-alive 与 pipeline 为了缓解源站的压力,一般会在用户和后端服务器(源站)之间加设前置服务器,用以缓存、简单校验、负载均衡等,而前置服务器与后端服务器往往是在可靠的网络域中,ip 也是相对固定的,所以可以重用 TCP 连接来减少频繁 TCP 握手带来的开销。这里就用到了 HTTP1.1 中的 Keep-Alive 和 Pipeline 特性: 所谓 Keep-Alive,就是在 HTTP 请求中增加一个特殊的请求头 Connection: Keep-Alive,告诉服务器,接收完这次 HTTP 请求后,不要关闭 TCP 链接,后面对相同目标服务器的 HTTP 请求,重用这一个 TCP 链接,这样只需要进行一次 TCP 握手的过程,可以减少服务器的开销,节约资源,还能加快访问速度。这个特性在 HTTP1.1 中是默认开启的。 有了 Keep-Alive 之后,后续就有了 Pipeline,在这里呢,客户端可以像流水线一样发送自己的 HTTP 请求,而不需要等待服务器的响应,服务器那边接收到请求后,需要遵循先入先出机制,将请求和响应严格对应起来,再将响应发送给客户端。现如今,浏览器默认是不启用 Pipeline 的,但是一般的服务器都提供了对 Pipleline 的支持。 在正常情况下用户发出的 HTTP 请求的流动如下图: 在整个过程中,最关键的是前置服务器和后端服务器应当在 HTTP 请求的边界划分上达成一致,否则就会导致下图所示的异常: 当我们向代理服务器发送一个比较模糊的 HTTP 请求时,由于两者服务器的实现方式不同,可能代理服务器认为这是一个 HTTP 请求,然后将其转发给了后端的源站服务器,但源站服务器经过解析处理后,只认为其中的一部分为正常请求,剩下的那一部分,就算是走私的请求,当该部分对正常用户的请求造成了影响之后,就实现了 HTTP 走私攻击。 那么如何让 HTTP 请求变得“模糊”呢?长度! CL 与 TE CL 和 TE 即是 Content-Length 和 Transfer-Encoding 请求头(严格来讲前者是个实体头,为了方便就都用请求头代指)。这里比较有趣的是 Transfer-Encoding(HTTP/2 中不再支持),指定用于传输请求主体的编码方式,可以用的值有 chunked/compress/deflate/gzip/identity ,完整的定义在 Transfer-Encoding#Directives 和 rfc2616#section-3....

2020-04-08 · 4 分钟 · rook1e

一个憨憨的 2019 年

拖到 3 月才开始写年终总结,因为年后一直在等初试成绩,结果成绩惨不忍睹。虽然算是在预料之中,但心里有一个小角落不愿意接受这次失败,每天断断续续的反思、找借口,反思、找借口无限循环。中午刷到 P 神 2015 年的一篇「三年」,看完感触挺深的,也解答了我心里的一些疑问,于是决定彻底解剖心里的那个小角落,把对 2019 年的反思清清楚楚写出来。至于为什么不按惯例存在语雀而是直接发在博客上,我是想把这篇总结当作检讨书贴在教室的墙上,把自己的愚蠢公之于众,留在互联网的记忆中,如果十年后还能在搜索引擎快照中看到这篇文章,希望同样能警醒未来自己。敢大声说出来,是面对自己的第一步。 2019 简述 对我这才二十几年的人生,2019 年算是挺重要的。寒假期间选择了放弃继续实习,决心去考北邮的网安院。确实是一个很艰难的决定,辜负了老师和团队的期望。我也觉得这不是人干的事,但事已至此,不求能得到原谅,我未来努力弥补吧。 开学后 4 月份开始复习,说是复习,其实专业课和数学就是从头学。由于大学四年都没正经学习,高中的学习能力丢得没剩多少,枉费了山东高考生的血统,一边找状态一边踩坑,复习得极其应试。 数学,一生之敌。4 月到暑假前狂刷三大计算的例题和同济教材课后题,后期做真题人就傻了。方向错了,再努力也只是愚蠢的自我感动。数学这种癌症晚期的情况,感染到了专业课,误以为 803 会和往年一样送分,就只做了王道书里的课后真题和 803 真题,美滋滋的计划凑 300 多分就够了。等上了考场,上午受尽数学折磨,下午 803 直接把我愉悦送走。 成绩除了专业课有点意外,其他的都在意料中,四门全是 6 开头,六六大顺,寓意倒是挺好。整个备考的时间安排、思维方式,总结起来就四个大字——自以为是。高估了自己的学习能力,低估了竞争对手的实力。出分后同一组的考生组了一个群,我才发现对我而言是变态辣的数学一有人能考到 120+,把我难到做不完的 803 也有人能考到 120+,所以说不是题难,而是我这一年的复习努力根本不配上岸。抱着看热闹的心理,顺便加了 8 组的群,想看看报天枢的神仙们是怎么打架的。虽然群里很多时间是匿名聊天,但还是能看出来存在不少高分且 CTF 赛棍 buff 的大手子,一个之前在北邮大群里比较活跃的老哥成绩跟我差不多,干脆签了深信服不再二战了。这么说起来,平日里在群里比较活跃的似乎都考的不行,明白了,今年少说话,当个老实人。 人就需要比一比,才知道自己是多么的菜。 19 年在生活上并不顺利,没有照顾好自己的身体,也没能爱护最亲近的人,愈发感觉自己幼稚且病态,这部分不多说,点到为止。 当然 2019 也不全是糟心事。 2018 年开源的 hexo-theme-fluid 还活着,而且交给社区之后小日子过得挺好,截止到现在 584 个 star,按下半年的趋势,突破 1k 指日可待。不说有多少技术含量,但至少是和大家一起用心维护起来的,组建没几个月的微信群也快 200 人了。转眼间快两年了,当初第一个 star、issue、pr 出现在时间线上的时候,激动且紧张,小心的经营着生怕做错了什么把人吓跑了,哈哈可能这就是开源的魅力吧。 5 月左右,想给简历上整点东西,逮着什么挖什么,倒是意外收获了两个 CVE,虽然漏洞简单到现在不愿意提,但收到确认邮件的那天还是兴奋得飞起,现在回忆起来还挺有意思的,人生中能让人激动到跳起来的机会又能有几次呢。暑假回家呆了接近二十天,混了混 edusrc,兑换到一张交大的漏洞证书就停了。 去年的这个时候,准备趁开始复习前的最后一点时间写个给社团训练和比赛用的 AWD 平台,就开了坑,结果拖延症拖到现在成了毕设,当初的仓库还是 W.I.P 状态。最近刷大佬们的博客,发现毕设都是漏扫或者自动化代码审计工具,就我的跟闹着玩一样,菜,认了。 最近写毕设的时候,因为要用 Docker 而且预期的部署环境是 Linux,就选择开 Ubuntu 的虚拟机做开发环境,vscode 远程连接写代码,不得不说还是很方便的,偶尔出现错误提示,一般都能靠重启 vscode 解决。但写了一段时间总是觉得怪怪的,还是不得不换到双系统的 Ub 上,gnome-shell 动不动就把风扇搞得嗡嗡响,嫌弃之余在知乎被 Arch “传销”洗脑,决定试试 Manjaro。于是格了 Ub 的分区装 KDE 版的 Manjaro,使用时意外的顺滑,没有出现驱动不兼容的情况。用到现在两个月左右,没出现任何问题,卡顿都没得,爱了,以后逢人便夸 Arch 好,有时间单独写一篇吹文。...

2020-03-14 · 1 分钟 · rook1e