【Pwn#0x0C】*CTF 2018 babystack
攻击GLIBC的TLS结构体,覆写Canary。快速学习了一下Pthread,大致知道了多线程的用法。
starctf2018/pwn-babystack at master · sixstars/starctf2018 (github.com)
GLIBC 不仅把 Canary 放在 TLS(Thread Local Storage)中,还把 TLS 放在线程栈顶上(与线程栈有固定的偏移)。这就出现了覆写 Canary 的可能。
漏洞分析程序逻辑很简单,就是开一个线程,然后这个线程里存在一个超大的栈溢出。
程序会用寄存器 fs 来存储 TLS 的位置,而 canary 就在 fs+0x28 的地方,如下结构体定义所示:
12345678910111213typedef struct { void *tcb; /* Pointer to the TCB. Not necessarily the thread descriptor used by libpthread. */ dtv_t ...
【Pwn#0x0B】NJCTF 2017 messager
省流:Canary爆破,顺便复习了一下Linux socket API,还知道了IDA View下右键数值常量可以查找对应的枚举名(前提是要指知道枚举名的开头)(比如AF_INET、SOCK_STREAM等)。
程序逆向一开始程序创建了一个监听套接字,逆向得到逻辑大致如下:
123456789static struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(5555);addr.sin_addr.s_addr = htonl(0); // 0.0.0.0static int listen_fd = socket(AF_INET, SOCK_STREAM, 0);setsockopt(listen_fd, ...);bind(listen_fd, &addr, 0x10);listen(listen_fd, 0x400);
创建完毕后,主进程进入 accept-fork-close 循环。而 fork 出的子进程会调用函数 sub_400BE9 从套接字读取输入(存在栈溢出), ...
【Network#0x00】自顶向下笔记#Ch1
1.1 What is Internet软硬件实现角度:各种各样的终端设备 end system通过线路和 packet switch 链接在一起,中间有一张大网——因特网核心。终端设备通过 ISP(Internet Service Provider)与这张大网连接在一起,ISP 之间也互相连接。在 end system、packet switch 等网络设备上进行传输的,是遵守协议 Protocal的数据包,作为所有设备间的约定来规范网络上的数据形式。这些规则大部分由 IETF 制定,称为 RFCs,也有由 IEEE 等组织指定的标准。
功能角度:在终端的眼中,网络是提供服务和应用的基础设施。终端可以借助网络接口来使用或构建分布式应用。
1.2 The Network Edge在网络的边缘,有各式各样的网络的终端设备,比如 PC、服务器、移动设备、以及越来越多的各式智能联网设备(The Internet Of Things),它们都可以被称为 host。不过很多时候,这些 host 有着 client 或者 server 的差异。
1.2.1 Access Internet接入网络 ...
【PoRE#0x00】欢迎来到逆向工程原理
为了在学校的高强度课程《逆向工程原理 Principles of Reverse Engineer》存活下来,站主决定开启一个系列笔记,并同步到博客上。目标是将课程以及实验的要点以人话讲清楚,整理一些便于查询的cheatsheet,并尝试拓展学习一些有趣的内容,以便同学和自己参考。(如果有同学看的话(´_ゝ`))
本期作为第0期,主要记录课程的基础设施使用方法。
在 PoRE 中使用 git本课程所有的 slides 获取、作业获取以及作业提交都通过 GIT 完成。GIT 作为一个分布式的版本控制软件,自然有强大的文件同步功能,能在客户端和服务器之间同步文件。
完整的 GIT 系统是经典的客户端-服务端架构,服务器上存储了 GIT 仓库。我们经常使用的 github,提供了 GIT 仓库的托管服务。而在PoRE课程中,我们使用的是课程搭建的 GIT 服务器。在课程 GIT 服务器上,有如下一些仓库(repository,简称repo):
release:LAB 的分发版本
pore_2130xxx0xxx:每个人的个人仓库,主要用于提交
slides:存放课程的 slid ...
【Pwn#0x0A】pwnable.tw tcache_tear writeup
完全自己做出来的一个堆题,算是入门堆利用了吧哈哈。
程序分析GLIBC 2.27 64bits,关闭了 PIE。菜单题,提供了 alloc、free、info、exit 四个功能。
通过 alloc,用户可以自由申请小于 0xff(不含 chunk header)大小的区块并向其中填入 size-0x16 个任意字符(奇怪的限制)。整个程序只有一个放指针的槽位,是一个全局符号,记为gptr。
通过 free,用户可以释放全局符号 gptr 指向的空间。但程序使用局部变量作了限制,程序最多只能 free 8 次。漏洞:free 完没有清空指针
通过 info,用户可以用 write 打印全局符号 name 处的值。这个符号本没有名字,但程序一开始会让我们输入一个 name 存储在这个符号的位置,所以就叫他 name。
通过 exit,用户可以退出程序。
程序没有什么自带的后门函数,orw 的三个函数都不齐。
思路结合分析可以看出,必须要泄露 libc 基址才能搞事情。所以需要在 2.27 的版本下,想办法绕过 tcache 让 chunk 进入 unsorted bin 来获取 li ...
【Pwn#0x09】ZCTF 2016 note2
正在学习Unlink - CTF wiki,参考上面的方法自己打了一遍,其实是感觉上面的方法有些不必要的步骤,因此自己做的时候简化了一下……
题目分析ubuntu16 64bit 菜单题Partial RELRO,no PIE –> 可以覆写 GOT 进行攻击
提供了四个功能:
添加 note,size 限制小于等于 0x80 且会被记录,note 指针会被记录。
展示 note 内容。
编辑 note 内容,其中包括覆盖已有的 note,在已有的 note 后面添加内容。
释放 note。
程序存在两个漏洞:
在添加 note 时,程序会提供写入 note 内容的功能。这里使用了一个循环且每次读取一个字符的自己写的读取函数,循环次数是 size-1 次,然而比较是无符号数比较(看来以后 for 循环里的比较符号类型也要好好注意)。所以如果 size 是 0 的话,程序就会一直读取,是一个堆溢出漏洞。
在编辑 note 时,程序采用及其奇怪的各种字符串操作来读取。不解释原理地简单来说,如果编辑的 note 之前 size 填入的是 0 ,而且输入的字符串大小大于 0 的话, ...
【CSAPP#0x02】程序:从源码到终止
概述本文将从源代码开始,追溯一个简单程序从编译到运行结束的全过程。系统环境是 WSL2 Ubuntu 20.04.5 LTS,编译使用 gcc 和 glibc 版本为 gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0 以及 GLIBC 2.31-0ubuntu9.9。使用的程序代码如下:
12345678#include <stdio.h>#include <stdlib.h>int main() { char *s = (char*)malloc(16); scanf("%15s" , s); printf("Hello %s\n" , s); return 0;}
1 编译和链接我们平时使用的”编译器”gcc,其全称是 GNU Compiler Collection,是一套组合程序,即教材中的 compiler driver。gcc将程序编译为完整程序的过程可以分为如下几步:
预编译:C 预编译器 cpp 会处理源代码中的宏以及引用,并简化代码(删除所有注释,调 ...
【Pwn#0x08】0CTF 2017 babyheap
放寒假了,于是我把ptmalloc2机制又重新学习了一遍,开始做点简单的堆利用题了!本题一半抄一半自己摸,也算是基本搞懂了,这里放一个笔记。
基础信息:ubuntu16(glibc2.23),菜单题,64 位,保护全开。提供 alloc、 free、dump、fill 功能,同时允许分配 16 个区块。
漏洞:fill 功能可以向区块写入任意长度信息,也就是堆溢出。
由于保护全开,于是 pwn 的目标便是:
泄露 libc 地址
修改__malloc_hook 为 libc 中的 one gadget
泄露 libc 地址ubuntu16 下没有 tcache 机制,因此只有 fast bins 和 3 个普通的 bins。其中,fast bins 以单链表形式维护,非循环链表,因此无法泄露 main_arena 的 malloc_struct 地址。而普通 bins 都是循环链表,large bins 比较复杂,但 unsorted bins 和 small bins 中的 chunk 都会有指向 arena 的指针。
我们需要泄露这个指针,就需要想办法构造 UAF 或者 ove ...
【杂谈#0x04】
最近发生了很多事情,但我也总结不出什么道理,所以就写个杂谈来分享下我看到的事情和我的感受吧。
第一是疫情防控的急速转变。从乌鲁木齐市的大火开始,网上就有一股强大的反抗当前防疫政策的力量出现了。那段时间是我朋友圈里,不存在的文章占比最高的一段时间。甚至不仅仅是网上,在现实中也有许多人开始抗议,以举白纸的方式。这很显然是多个因素推动造成的,其中不乏境外势力的推动。但是不论因素是什么,民众中已经形成一股怨气了。可想而知,不论多么小心,未来一定会有类似乌鲁木齐大火一样的惨剧发生,这是中国作为一个大国所无法避免的,这里的大说的是规模、人口、差异之大。而网络的存在又消除了信息的传播限制,使得全国都能获取到事件的相关信息,使这股怨气仿佛滚雪球一般越传越大。因此在这种情况下,选择放开是十分合理的措施,并且一定要放开到让老百姓意识到明显不同的程度。所以现在大的真的来了:
pafd。出校刷卡。线上。提前。推迟。后续安排问卷。活动取消。离校。抢票。见证历史。一时间所有的东西都转了起来。
第二是不可抗力带来的迷茫。在这周三四五,我每天都遭受了一次课业上的打击。周三错过了一学期只点名一次的毛概点名;周四在集合与 ...
【Pwn#0x07】THUCTF 2022 babystack_level3
比赛链接:THUCTF2022(报名了比赛的账号现在(2022/11/15)还可以下载附件和开启实例)
学习了一下ret2dlresolve的基础。在NO RELRO的时候,程序的.dynamic节被存储在RW的地址空间,而其中的一个指针strtab指向的是动态链接的符号表。我们可以把这个符号表提取出来,修改一下,存在一个别的地方,然后把.dynamic里面的指针修改到那个地方。然后程序就会使用我们的假字符串表来进行动态符号解析!
题目分析
整个程序,一个输出函数都没有,但是保护只开了NX。很显然是要用ret2dlresolve来做。(实际上做题目的时候我还没学ret2dlresolve,然后去网上搜没有输出函数怎么打搜到的哈哈哈)
漏洞是可以在一个固定地址读入0x110个字节,并且可以栈溢出0x10个字节,也就是刚好把返回地址给覆盖掉。那么思路就是
把rop chain读到固定地址那里,然后stack pivot过去
rop chain是构造一个假的dynstr表(比如把read改成system),然后把.dynamic那里的指针改成假的dynstr,并且跳转 ...