【Pwn#0x11】TAMUctf 2023 Pwnme - linked ROP chain
当溢出长度过短无法完成完整的ROP时,一般会想到stack pivot,也就是在某个固定的、可控的地址处提前布置好ROP链,然后通过 leave; ret 或是 xchg eax, esp 等方法完成栈迁移。但在本题中,我们没有机会往已知地址写入数据,溢出大小又有限制。官方给出的方法是:通过 sub rsp, 0x18; call vul 这个非常规gadget,将提前布置好的ROP chain放在栈的高位,从而完成ROP chain的链接,我管它叫linked ROP chain。
比赛时和前辈两人看这题看了几个小时,找gadget找了很久也没做出来。比赛结束后发现了两个版本的做法,分别是官方的和Chovid99师傅的的。官方的做法比较一般,并且和我们比赛时的思路完全一致(只是我们傻了没发现那个关键gadget),因此本文主要分析官方的做法。
题目给了两个binary:
pwnme:什么函数都没有,只有一个main函数调用了libpwnme库的pwnme函数。12345Arch: amd64-64-littleRELRO: Partial RELROStack: ...
【PoRE#0x05】Proj1 指北
在上PoRE前,我是Android零基础小白,Java也没写过。刚刚接触那些Lab时,虽然挑战性也是有的,但终归是小打小闹的练习性质,只是助教出的题目。
然后那天,Proj1降临了。
真实软件逆向,而且参考目标还是微信。(微信是操作系统(雾))
开始前,前辈和我说过:没有做的时候都会以为这不可能,但其实你可以的。现在做完了PJ1,我也想对后来的同学说:虽然这可能会耗费非常多的时间、精力,但我认为这是值得的!这可是复杂度超高的真实软件、商用软件、以及操作系统软件,逆向成功就已经代表了——你已经有了在安卓世界中遨游的资格。
但是,我当然不会觉得耗费时间多是PJ1的优点。我想在这里总结一些做PJ1的经验,能帮后来者节省一些时间就最好了。
工具 & 环境在做PJ1时,我们需要准备一个好的调试环境。
最好的调试环境显然是真机,因为性能足够,可以提高调试的体验。如果你有一台备用手机的话,可以尝试网上查询root方法。我的备用手机是红米K30Ultra,使用root方法是Magisk。root成功之后,推荐LSPosed模块,这是一个支持Xposed模块的框架,在安卓高版本也可以运行。Ma ...
【PoRE#0x04】Frida & Android
Frida是一个几乎全平台(Windows、MacOS、GNU/Linux、IOS、Android)的代码插桩软件。它能够把谷歌的V8引擎(JavaScript、WebAssembly引擎,即解释器)注入到目标进程中,允许我们编写的JS脚本拥有对于整个进程内存空间的访问权、Hook进程里的代码、直接调用它们等……
Frida功能强大,且使用非常便捷、快速。比如在Android平台,Xposed模块也一样可以做到插桩,但调试起来麻烦得多,每次都要生成APK、安装APK、添加模块、重启环境。而Frida甚至不需要编译!官网对它的描述是 Scriptable,编辑后运行,直接就能够看到结果——你甚至不用重开目标进程!
如何使用Frida?Frida包括一个需要在目标机器上运行的Frida Server,同时,在本机上(用于写脚本的机器)提供了命令行工具(Frida CLI tool)、也可以用Python调用Frida API或直接编写JS脚本。
本笔记收集了一些安卓使用Frida的资源。
推荐食用方法是:
安装:如果你是PoRE学生,可以直接用助教给的方法,在虚拟机进行安装配置 ...
【Pwn#0x10】pwnable.tw Re-alloc writeup
相关:realloc、tcache2.29
借用了很多巧合,实在是特别“幸运”的一个利用。自己做出来之后,发现网上大部分wp都和我的解法不一样,但是更通用一些,不像我的那么极限(草)。
漏洞分析保护情况:
123456Arch: amd64-64-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: No PIE (0x3fe000)FORTIFY: Enabled
程序是一个菜单,提供了alloc、realloc、free功能,来操作bss段的两个栏位,大致功能如下:
alloc:选中栏当前为NULL时,使用 realloc(NULL, size) 分配新的区块并读入数据;
realloc:选中栏当前非NULL时,将选中栏使用 realloc(ptr, size) 来调整大小并(如果realloc返回值非0)读入数据;
free:将选中栏使用 realloc(ptr, 0) 进行释放,并将指针置零。
主要的漏洞在于realloc的使用上,可以通过RTFM(在线m ...
【PoRE#0x03】Burp Extension
官方教程:Creating Burp extensions - PortSwiggerMontoya官方文档:MontoyaApiMontoya官方示例:PortSwigger/burp-extensions-montoya-api-examples: Examples for using the Montoya API with Burp Suite
Burp Suite过去插件开发使用的是Extender API,不过最近推出了一套新的API(今年1月刚刚发布),叫做Montoya API。新的API增加了Burp Suite插件开发的简便性,但是似乎并不完善,还有一些接口没有实现的样子。
对于Lab4中的任务,也就是自动处理HTTP包的插件,可以参考这个例子:burp-extensions-montoya-api-examples/proxyhandler/src/main/java/example/proxyhandler at main · PortSwigger/burp-extensions- ...
【Pwn#0x0F】UTCTF 2023 Bing Chilling
Loongarch ROP比赛时发现了这是LoongArch的ROP,然后不太会找gadget就放弃了。赛后看大佬的writeup,发现只要找到一个关键的来自_dl_runtime_resolve的gadget,就可以万事大吉了。复现参考:CTFtime.org / UTCTF 2023 / Bing Chilling / Writeup
环境准备我们都知道 Linux 下的可执行文件是 ELF 格式,但 ELF 也分架构,比如这个 binary 就并不是 amd64 架构的,而是 Loongarch 龙架构。
12$ file hellohello: ELF 64-bit LSB executable, *unknown arch 0x102* version 1 (SYSV), statically linked, for GNU/Linux 5.19.0, with debug_info, not stripped
可以看到其 ELF Header 中的 arch 字段值为 0x102,是一个 file 未知的架构。在网上查询 0x102,可以知 ...
【PoRE#0x02】Android APP Reverse PartII
上篇见 这里本篇施工中……
4 Advanced App Features4.1 Multi-threading多线程是一种常见的提升程序性能的技术,在 Android 中也普遍使用。比如,Android 中所有的 UI 交互都是由一个线程来处理的,这个线程被称为 UI Thread。实际上,这个线程就是应用程序的主线程(Main Thread),大部分组件都运行在这个线程中。有些耗时的操作不能在主线程中运行(比如网络相关的操作),开发者需要手动为其开启新的线程。当这些工作线程需要操作 UI 时,他们通过发消息给 UI 线程完成。
接下来介绍 Java 中创建线程的方法、UI 线程、以及线程间交互的方法(包括复杂的 Asynchronous Messaging 与简化后的 AsyncTask)。
4.1.1 Java Multi-threading参考:Java 多线程编程 | 菜鸟教程 (runoob.com)
// TODO
4.1.2 Android UI Thread所有与 UI 相关的操作都在 UI 线程中进行,换句话说,想要进行 UI 操作,就必须通 ...
【Pwn#0x0E】UTCTF 2023 Printfail writeup
非栈上的格式化字符串利用。
非栈上的格式化字符串利用方法参考文章:非栈上格式化字符串漏洞利用技巧-安全客
想用格式化字符串来覆写任意位置的数据时,通常是把指针附在字符串的末尾,然后用 %k$n 来引用这个指针。但是如果程序不在栈上读取字符串,就没有办法指向自定义的指针了。
当然,方法依然存在,就是利用栈上已有的指针。在 64 位环境下,如果栈上存在一个指另一个指另一个的三级链结构(也就是两个指向栈的指针),就仍旧可以构造出任意的指针,如下图所示:
123456789101112131415161718┌────────────────┐│ │├────────────────┤│First PTR │├──────────────┬─┤│ │ ││ │ │├────────────┬─▼─┤│Second PTR │ │├────────────┴─┬─┤│ │ ││ ┌───┬───┬───┤ ││ │ │ │ │ │├──▼─┬─▼─┬─ ...
【Pwn#0x0D】HackIM CTF 2023 spygame writeup
我们CTF萌新小分队已经达到了4人之多(`ヮ´),这次排名41/433,感觉很好~这道题有十个队做出来,很高兴我也弄出来了,还顺便大致学会了docker配本地环境,挺感动的~~
漏洞:随机数未设种子、数组下标溢出
程序逻辑程序给了 N 个代码源文件以及DockerFile。主要逻辑是用 C code 写的,但是封装成了一个 Python 可以调用的模块,名为 spy,相关信息参考python文档 Extending Python with C or C++ — Python 3.11.2 documentation。
game.py 会让玩家选择游戏模式(easy or hard),然后调用 spy 模块的接口,如果返回通过就把 flag 打印出来。spy 模块的主要逻辑大致如下:
首先进行八轮循环,每轮循环中:
生成一个固定大小的数组,元素类型 uint8_t
随机取两个数交换
打印交换后的数组
玩家输入两个 index(这一步将会计时,并分别将前后的时间保存到局部变量 start_ns 和 end_ns 中)
程序交换两个 index 的值
程序检查交换后数组 ...
【PoRE#0x01】Android APP Reverse PartI
下篇见 这里
上周老师带我们速通了 Android 的 APK 结构、架构以及 Android 系统本身的架构,本人课上走了一会神就再也跟不上了,课后一边 STFW 一边过了一遍 PPT,现在再用这篇笔记过一遍。(可能存在一些错误,希望看到能顺手和俺说下)
本篇笔记分为三个部分,App、System 以及 SDK。
1 Android App安卓 APP 具有三种形态:
source code
APK(安装包)
App(安装好的软件)其中,APK 几乎等价于 App,例如安卓 QQ 就可以直接导出一个软件 APK(虽然有几率出现问题)。课程讲述逆向工程,直接用 APK 的视角来讲述一个安卓软件;但我们这里也可以采取另一种视角 —— 先来看看 source code 阶段的安卓 App 是什么样的。
1.1 source code在 source code 阶段,App 由 .java 源代码、.xml 数据文件以及别的一些多媒体资源组成。上述的三种文件,大致通过下面的结构被组织起来:
manifests 文件夹:存放 AndroidManifest.xml
java 文件夹: ...