A CTF PWNer Blog

Welcom to Gamous’Site.

  • I’m exploring computer science and security realm,
  • and … desire to be a binary whitehat with a cat.

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 · γ

Embedded Security CTF writeup

在web上即可体验的 iot PWN (MSP MCU),给了一个很具体的设定以及对应的硬件手册,可以快速聚焦到固件安全,值得一玩的电子锁开锁游戏 手册 https://microcorruption.com/manual.pdf 工具 https://microcorruption.com/assembler MSP430汇编指令集 - MSP430™16 位超低功耗 MCU - 文件中心 - E2E™ 中文支持论坛 (ti.com) [0x00] Tutorial - 10pts 介绍WEB上的调试界面,略 F12大致看了一下,是在后端运行的固件,然后发送cmd会返回更新的状态,再渲染到前端上,不过不知道是用的是不是qemu模拟,要把几个陷门中断全部接管到web后端程序上,感觉真在板子上实现的话多少有点麻烦 [0x01] New Orleans - 10pts Lockitall LOCKIT PRO r a.01 ______________________________________________________________________ User Manual: Lockitall LockIT Pro, rev a.01 ______________________________________________________________________ OVERVIEW - This is the first LockIT Pro Lock. - This lock is not attached to any hardware security module. DETAILS The LockIT Pro a....

April 16, 2021 · 36 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 · γ

Ethernaut writeup

尽量一周内更新完 Hello Ethernaut 熟悉操作 await contract.info() // "You will find what you need in info1()." await contract.info1() // "Try info2(), but with "hello" as a parameter." await contract.info2('hello') // "The property infoNum holds the number of the next info method to call." await contract.infoNum() // 42 await contract.info42() // "theMethodName is the name of the next method." await contract.theMethodName() // "The method name is method7123949." await contract.method7123949() // "If you know the password, submit it to authenticate()....

April 4, 2021 · 5 min · γ

Sandbox Staff

maybe update in future Sandbox In Linux File system isolation chroot jail chroot(1): /usr/bin/chroot ; chroot(2): a function of glibc chroot(1) chroot - run command or interactive shell with special root directory chroot [OPTION] NEWROOT [COMMAND [ARG]…] chroot(2) chroot - change root directory int chroot(const char *path); chroot is in order to change fs root. however, it’s not a secure feature. It could be escape via this tool(chw00t)....

March 31, 2021 · 2 min · γ

Repeater << Actor & Timezone

Actor Remember that you are an actor in a play, and the Playwright chooses the manner of it: if he wants it short, it is short; if long, it is long. If he wants you to act a poor man you must act the part with all your powers; and so if your part be a cripple or a magistrate or a plain man. For your business is to act the character that is given you and act it well; the choice of the cast is Another’s....

March 30, 2021 · 2 min · γ

Repeater << The Star

…My favorite classic SF. The Star ©Arthur C. Clarke From The Nine Billion Names of God: The Best Short Stories of Arthur C. Clarke (1967: rpt. NY: Signet/NAL, 1974: 235-240) All rights reserved; not to be reprinted without permission of the author It is three thousand light-years to the Vatican. Once, I believed that space could have no power over faith, just as I believed the heavens declared the glory of God' s handwork....

March 30, 2021 · 12 min · γ

Build Chromium

官方指南 提供了完整的说明,只要环境设置对然后一步一步跟着做就能编译成功 准备工作 截至2021-3-29需要设置的推荐环境 Windows 10 拥有至少 16GB 内存的64位计算机 最少 100GB 的磁盘空余空间(NTFS格式) VS2019 (>=16.0.0) Desktop development with C++ MFC/ATL support Windows 10 SDK (>= 10.0.19041 ) Debugging Tools For Windows depot_tools 系统变量 添加depot_tools路径到Path开始处 DEPOT_TOOLS_WIN_TOOLCHAIN = 0 设置vs2019_install为 Visual Studio 2019 路径 编译 my cmd history (从非cmd的shell中运行 gclient可能不能正常工作) gclient git config --global user.name "My Name" git config --global user.email "my-name@chromium.org" git config --global core....

March 29, 2021 · 1 min · γ

QKD 量子密钥分发

QKD的物理原理 利用量子的测量特性来进行密钥方法而不是量子纠缠 基于以下物理原理 量子具有4种自旋 |0> |1> |+> |-> ,分别在两个测量基 十 和 X 上 |0> |1> 自旋的量子只能在测量基 十 上测准 |+> |-> 自旋的量子只能在测量基 X 上测准 使用错误测量基测量量子会扰动量子,使其在另一个测量基上的分量以1/2 1/2的概率分布到这个测量基,则只有1/2概率测准 使用错误测量基测量量子会使量子自旋改变 基于上述原理的密钥基本方法 Alice发送特定自旋的光子给Bob Bob选择随机测量基进行测量 Alice发送正确测量基 Bob将接收到的正确测量基与选择的测量基比较,判断是否选对测量基 Bob将测量基是否选择正确告知Alice 若测量基有效,则测量结果即为双方交换成功的秘密比特 进行若干次上述过程后,Alice和Bob就有了一组互相知道的密钥 抗第三方的原理 上面交换的过程是可以被监听的,第三方只要截获光子,根据Alice发送的正确测量基来获得测量结果后即可得到光子的状态并发送相同状态的光子给Bob 将以下QKD过程与上述进行比较: Alice发送特定自旋的光子给Bob Bob选择随机测量基进行测量 Bob发送选择的测量基 Alice将收到的测量基与正确测量基比较,结果告知Bob 若测量基有效,则测量结果即为双方交换成功的秘密比特 错误测量基会导致光子改变,因此若是第三方窃听了光子必然导致Bob收到的光子与Alice发出的不同,基于海森堡测不准原理,第三方不可能在不知道测量基的情况下复制出状态相同的光子。因此在第三方监听的情况下,第三方有1/2的概率选错测量基,1/2的概率由于测量使得光子自旋变化,这样就使得Bob收到的光子有1/4的概率与Alice发出时的状态不同。这为检测第三方监听提供了依据,但必须牺牲一部分交换结果来确认双方的结果是否相同才行。同时,若是第三方持续监听,将使得交换信道不可用。 从实现角度,由于光子的自旋即偏振,通过单光子发射器 发生的单光子通过偏振片即可生成垂直、水平、+45°或-45°的偏振态。 BB84协议 Alice发送需要交换的密钥长度给Bob Alice发送一组特定自旋的光子给Bob Bob选择随机测量基进行测量这组光子 Bob发送选择的测量基序列 Alice将收到的测量基序列与正确测量基序列比较,将结果序列告知Bob 将结果序列为1的位上的测量结果作为本轮交换得到的密钥比特 重复几轮可以得到一个密钥序列...

March 9, 2021 · 2 min · γ

新博客第一篇

第三次迁移博客 从开始的WordPress,到更轻量的 Typecho, 因为腾讯学生机到期的缘故,不得不对博客进行迁移,但是由于早期搭建博客的时候并没有使用docker对博客进行portable的管理,以及混乱的组织,以至于我并不想简单地把数据库简单地迁移到一个docker里然后在我的另一个vps继续使用,我对php并不熟悉,使用typecho是因为它轻量且支持markdown,仅此而已,但它的后台,评论,诸多动态的内容并不是我需要的东西,我只是需要一个生成器,把我的markdown生成为好看的html,然后剩下的交给websever。 因此我决定放弃原来博客的所有SEO,任其关闭而不做平滑迁移,把博客改成静态站。 比起html parser,写一个html generator简单得多,而一个基础markdown parser也并不困难,因此我尝试自己写并很快写出能输出原始html的demo,但很快我意识到,现成的静态生成器有相当多漂亮的主题,而如果自己造轮子,除了还要处理sitemap和rss的生成,还要在前端的主题上花费许多时间,这使我决定拥抱现成的生成器,hugo是个很棒的选择,它使用golang编写,比起nodejs,我更喜欢golang(但还不太想在逆向中看到它满屏的routine函数),然后我找到一个简洁的主题papermod,这就是这个新博客的由来。 我花费了半个下午学习hugo和这个主题的一些设置,感觉还有些不足,会在之后修改。 这里是一个TODO (issues) categories page 直接显示文章 toc 在侧边显示 about 页面 post 生成的工具 … 以及我将尝试使用正在学习的rust写一个webserver作为这个博客的server,我不指望它的性能能和nginx比,但他或许比nginx更安全,一个rust写的webserver托管一个静态站点,听起来将使任何对这个站点感兴趣的hacker望而却步,这很有趣,不是吗,至少我不会在心血来潮翻看log时发现一堆php-fpm溢出攻击的流量,以及翻看后台时满屏的垃圾评论,KEEP IT SIMPLE,简单使我快乐。...

March 6, 2021 · 1 min · γ