GamousのDiary

记被我浪费的时光 R.I.P. 想做好多,时间好少,慢慢来吧 2021-3-28 看到skr师傅的博客日记,深受启发,决定写自己的日记好让以后的自己知道时间浪费在哪了 由于之前有个在浏览器层做hook玩的想法,决定深入了解下chromium,先从编译chromium开始 翻译了一半chromium windows的编译指导,感觉没啥意义就直接去装了部署工具开始fetch源码,花了一晚上 2021-3-29 花了一整天编译最新的chromium,五万多个obj文件,第一次编译这么大的项目很兴奋,从早上10点编译到晚上,中间clang cli崩溃了好几回,因为直接build是不支持mp4等主流媒体格式的,又重新编译了一遍 拿自己编译的浏览器逛b站,略卡,但是各方面看起来比现在用的chrome确实有不少改进,有趣 初步了解了下chromium的项目结构和media相关的一些处理,对video的释出有一些想法,搜到了一个思路近似的文章 1 2 找到一个学习chromium项目里一些机制和函数的项目,接下来要学习下3 TODO push 这部分笔记得补上 学习下chromium机制然后试着去修改出想要的样子 等好好学完编译要写个简易浏览器 2021-3-30 看到一篇很解压的小诗,突然缓解了我的焦虑,贴在博客里 找了点关于fuzz的资料,今天摸鱼了,午饭没吃睡了一整个下午 感觉自己之前学了这么长时间的pwn太局限于ctf了,路子有点问题,接下来得多点开发技能点以及realword中漏洞发现的手段然后去复现 模糊测试 AFL… 静态分析 codeQL(之前学了一点,笔记还欠着) 模拟执行 angr, unicorn(很容易路径爆炸,得结合大量静态分析) 形式化验证 (这个得体系化学习范畴论,以后研究) 得试着养成每天阅读一点项目源码的习惯 发现了flanker师傅的blog,看了有关Fuzzing的分享,对主流的fuzz技术有了新的理解 中午和m牛讨论了下minecraft里设计DSL的一些想法,若是实现得好可以极大改变目前生电高复杂度设计的可理解性和可调试性,复杂度可以往上继续抬 TODO push 深入学习下afl的源码和使用然后去fuzz一个服务器程序 顺便想了下接下来想清理掉的一些技术坑: 编译原理 -> Parser -> MyBrowser 操作系统 -> MyOS Linux Kernel的深入学习 程序构造 SICP 函数式编程 Haskell 以及 Rust -> Rust编写 Webserver CSAPP 的 LAB Malloc 2....

December 31, 2099 · 1 min · γ

GDB cheatsheet

常用插件 pwndbg pwngdb peda gef heap 打印 info r <register> p print p &<symbol> 取地址 p *<addr> 间址取值 x/<num>gx <address> 查看内存数据(x64) x/<num>i <address> 查看汇编指令 配合set 可以设置一些指针变量方便读取 x hex d deci u unsigned hex o oct t bin a hex c char f float s string i insturction b 1 byte 8 bits h 2 bytes 16 bits w 4 bytes 32 bits g 8 bytes 64 bits 查看堆栈等...

July 7, 2077 · 2 min · γ

CVE-2021-4034

CVE-2021-4034 Pwnkit Linux Polkit组件 本地提权 从危险环境变量getshell Polkit Polkit 是一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程。 polkit预装在linux发行版中,其中的suid程序pkexec被发现可利用的存在内存漏洞 漏洞分析 修复后 src/programs/pkexec.c · a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 · polkit / polkit · GitLab 修复前 src/programs/pkexec.c · 0.105 · polkit / polkit · GitLab 可以看到有一个fix如下 /* * If 'pkexec' is called THIS wrong, someone's probably evil-doing. Don't be nice, just bail out. */ if (argc<1) { exit(127); } 当argc<1时的情况会被恶意利用,因此直接对这种情况退出 for (n = 1; n < (guint) argc; n++) { if (strcmp (argv[n], "--help") == 0) { opt_show_help = TRUE; } else if (strcmp (argv[n], "--version") == 0) { opt_show_version = TRUE; } else if (strcmp (argv[n], "--user") == 0 || strcmp (argv[n], "-u") == 0) { n++; if (n >= (guint) argc) { usage (argc, argv); goto out; } if (opt_user !...

February 24, 2022 · 5 min · γ

CVE-2021-3177

CVE-2021-3177 Python RCE https://nvd.nist.gov/vuln/detail/CVE-2021-3177 https://bugs.python.org/issue42938 https://www.randori.com/cve-2021-3177-vulnerability-analysis/ TL;DR 漏洞成因:sprintf格式化%f造成的栈上缓冲区溢出 sprintf(buffer, "<cparam '%c' (%f)>",self->tag, self->value.d); 这是个品相并不好的洞,在默认开启漏洞缓解机制的情况下几乎不能RCE,只能影响服务可用性 Compile 这个问题涉及的版本很广,2021年1月18号以前的版本普遍存在 这里选择的tag: cpython-3.10.0a4 关于Python的编译和源码调试可以参考 https://xz.aliyun.com/t/7828 PoC 漏洞发生的原理是sprintf时buffer固定但是格式化%f时可以生成一个较长的数字字符串,从而产生溢出,这里有精度部分可以覆写到返回地址 from ctypes import * x = c_double.from_param(1e300) print(x) 直接运行,发生了abort *** buffer overflow detected ***: terminated Program received signal SIGABRT, Aborted. 栈溢出被fority保护检测到了,随后abort Require 造成RCE需要的条件 从远程端传递一个不受信任的浮点数到ctypes.c_double.from_param (注意:Python浮点数不受影响) 将该对象传递给repr()(例如通过日志记录) 使浮点数成为有效的机器代码。 让缓冲区溢出在正确的位置覆盖堆栈,让代码得到执行 ctypes如果在一些网络库中被依赖使用时,则很有可能被利用造成DoS,在一些平台未开启Fority、Canary保护的Python版本(更可能是IoT设备)中存在RCE风险 Exploit 编译没有保护的版本 ./configure OPT="-O0" CFLAGS="-m32 -fno-stack-protector -fno-pie -fno-pic" LDFLAGS="-m32" 格式化%f只能产生ascii码'0'~‘9’之间的值,也就是0x30-0x39,因此rip/eip也只能劫持到形如[0-9]+的地址上去 因此需要利用mmap在相应的低位地址上提前布置好shellcode 打印c_double对象触发溢出时执行任意shellcode 利用脚本 from ctypes import (c_double, c_int, CDLL, memmove, create_string_buffer, addressof) ########### # contrived setup, map executable memory with shellcode exactly where we want # to jump (an attacker would have to set this up somehow) libc = CDLL(None) syscall = libc....

April 9, 2021 · 1 min · γ

CodeQL学习笔记

啥是CodeQL? Code Query Language CodeQL是Github Security Lab推出的一个基于语义的代码分析引擎,使用CodeQL可以让我们像对待数据一样去查询代码。通过编写查询条件来查找漏洞的所有变体以完全消除这个漏洞,并与他人分享漏洞查询语句 可以称之为基于模板的自动化变异分析 工作流程 将代码创建成数据库 编写QL查询从数据库中查询代码 解释查询结果 工作原理 数据库创建 使用语言相关的extractor从代码中提取抽象语法树(ast)、名称绑定的语义和类型信息,把源代码转化成单关系表示(single relational representation),以CodeQL数据库存储 执行查询 使用CodeQL专门设计的面向对象语言QL来查询此前创建的数据库 查询结果 将查询结果对应到源代码的上下文中去,即通过查询结果的解释找到源码中我们所关心的潜在漏洞 语义分析大概就是在ast中通过source正向找sink或通过sink回溯source,把审计变成路径查找 代码数据库 CodeQL 数据库包含从代码库中提取的可查询数据, 包含代码的完整、分层表示,包括抽象语法树、数据流图和控制流图的表示 每种语言都有自己独特的数据库模式,用于定义创建数据库的关系。该图为提取过程中的初始词汇分析与使用 CodeQL 的实际复杂分析提供了界面 对于每种语言,CodeQL 库定义类,以在数据库表上提供一层抽象 使用CodeQL securitylab.github.com/tools/codeql github security lab提供了一些教学项目以推广CodeQL,还举办有基于CodeQL的夺旗赛 https://securitylab.github.com/ctf/ 更提供了 LGTM ,开箱即用的在线CodeQL环境 这里基于Visual Studio Code搭建离线的CodeQL环境 相关文档 Writing a basic C++ Code QL query Introduction to CodeQL Learning CodeQL 安装CodeQL 安装Visual Studio Code 安装Visual Studio Code的CodeQL插件 按照 CodeQL 工作空间 完成剩下设置 代码数据库的获得 在LGTM....

April 4, 2021 · 7 min · γ