2021·第二届羊城杯WP
2021·第二届羊城杯WP前言还是没能写出很多题,不过对于那些题至少能看的明白,知道大概的思路是什么了…还需继续努力
PWNwhat you name保护全开+沙箱execve被禁,现在的比赛题就各种ORW…有点套板子的意思了…
free函数,没有清空堆块本身的指针,存在地址泄露
1234567891011121314151617unsigned __int64 sub_FF2(){ int v1; // [rsp+4h] [rbp-Ch] BYREF unsigned __int64 v2; // [rsp+8h] [rbp-8h] v2 = __readfsqword(0x28u); if ( (unsigned int)sub_C27(&v1) ) { free(*(void **)(*((_QWORD *)&unk_202188 + 2 * v1) + 8LL)); free(*((void **)&unk_202188 + 2 * v1)); *((_DWORD *)&unk_202180 + 4 ...
和kernel说个Hello吧!(一)
或许是最近飘了,想开始学习内核了,看到《庖丁解牛linux内核》这本书之后,萌发了一个调试内核的想法,所以这个系列应运而生,在最开始学习计算机的时候,都是从写Hello World!开始的,所以当我开始内核的时候,也想着延续这个传统(其实的听到xuanxuan老师讲到的😀),这篇文章是我第一次接触内核所写的文章,其实一直以来我都在好奇,如此庞大的操作系统到底是怎么启动起来的,本文旨在通过调试从start_kernel到init进程启动的过程来了解linux到底是怎么样启动起来的,如果你也想知道这个问题的答案,那就跟我看下去吧!
搭建环境要想调试首先就得有一个linux来调对不对,先搭建一个简单的linux内核,通过编译内核代码加上根文件系统来构建一个简单的操作系统,先去下载linux内核源码,虚拟机的网络(可能是源的问题吧)实在不太行,下载完成之后千万千万要注意不要在windows下面解压,因为在linux源码里面有个文件叫aux.c,这玩意和windows下的设备名为同一个名字,解压出来之后,会删除不了此文件,如果真的一不小心解压出来了,下面为解决办法,解铃还需系铃人啊!:
w ...
linux文件流攻击 -- _IO_FILE攻击
_IO_FILE攻击从exp中来看很简单,但其背后的含有并不简单,可以用复杂来形容,也很模板化,在比赛中有几种比较常见的形式,除了House of orange,还有用它来泄露libc地址(此文章重点讲解),接下来一起来看看,动手调一调,给自己留个深刻的印象
_IO_FILE到底是个啥?在一开始接触这个东西的时候,真的是一头雾水,各种结构体,晕头转向,其实IO_FILE的本质就是三个基本的文件流,stdin、stdout、stderr,这三个东西我们应该很常见,标准输入,标准输出,标准错误,在程序初始化的时候就已经默认生成好了,所以在通常情况下,我们再打开一个文件流的fd为3,那么这些文件流是通过什么来索引的呢?答:IO_list_all会通过单项列表保存所有的文件流:
_IO_FILE的源码在/usr/include/x86_64-linux-gnu/bits/libio.h或者libio/libio.h,可以去看看,里面有各种各样的IO函数,但我们只关注_IO_FILE相关的函数,下面是_IO_FILE的函数:
1234567891011121314151617181920 ...
高级ROP链构造方法(二)-- ret2dl_runtime_resovle
前面已经讲完了PLT和GOT表的作用,在那儿我留了一手,并没有讲清楚_dl_runtime_resolve_这个函数具体实现,还记得当时程序往栈上push了两个参数就进入_dl_runtime_resolve_了吗?不记得可以回去翻下
我们回忆一下当时那两个参数是什么,没错,一个是0,一个是0x804a004,这里先讲他们是啥,0呢,我们先理解成一个Index,而0x804a004是一个函数地址叫link_map,其实_dl_runtime_resolve_是通过link_map来找到.dynamic的
而.dynamic是什么呢?我们随便拉一个程序进IDA来看,我们可以看到里面有一些结构体,其实和_dl_runtime_resolve_紧密相关的只有三个:DT_STRTAB, DT_SYMTAB,DT_JMPREL这三个根据地址我们可以发现它们指向了.dynstr,.dynsym,.rel.plt
link_map+0x8的位置就是它要找的.dynamic,接下来我们再通过.dynamic找到.dynstr, .dynsym,`.rel.plt
.dynstr ...
从MIPS的发展史开始学MIPS
起源 当初和ARM比肩的MIPS,由于决策的问题和命途多舛,MIPS架构开始逐渐没落,曾经的辉煌也慢慢暗淡,但世间还残留着MIPS架构的余光,在目前的游戏机,打印机,路由器还有很多是MIPS架构的CPU,所以MIPS的学习并不能落下,而且学习各种CPU架构的设计思路,对于理解计算机也有着很大的帮助,虽然MIPS没落了,但RISC-V会带着它的余光继续前进…
全球三大芯片架构之一MIPS倒下!转身投入RISC-V阵营
MIPS,路在何方?
MIPS各寄存器介绍与对比与ARM和相比,MIPS也有很多特殊的特性,这些特性都旨在帮助CPU更好的完成工作
$zero寄存器时刻保存着常量0,至于为什么这么做,答:还是为了效率
零寄存器始终保持常量 0,除了 0 恰好是一个非常有用的常量这一事实之外,它并没有什么特别之处。如此有用以至于 MIPS 设计者专门使用一个寄存器来保存其值。(这样你就不必浪费另一个寄存器或任何内存来保存值。)
$1:即$at,该寄存器为汇编保留,由于I型指令的立即数字段只有16位,在加载大常数时,编译器或汇编程序需要把大常数拆开,然后重新组合到寄存器里。比如加 ...
从ARM的发展史开始学ARM
从ARM的发展史开始学ARM起源第一个ARM处理器是1983年10月-1985年4月间在英国剑桥的Acorn Computer公司开发的。那时候ARM代表Acon RISC Machine公司,并一直持续到Advanced RISC Machinelimited(ARM Limited)在1990年成立之前。
Aconn因为BBC(英国广播公司)微型计算机的成功而在英国个人计算机市场占据了强有力的位置。BBC微型计算机是以8位6502微处理器为核心的机器。
随着BBC在1982年1月一系列电视节日的介绍,它迅速成为英国学校的主流机器。它还在计算机爱好者的市场上享有热烈的支持,并找到了进人–些研究性实验室和高等教育组织的途径。随着BBC微机的成功,Acorn的工程师考虑用不同的微处理器去构造另一种机器。他们发现所有的商业供货均不充足。1983年可得到的16位CISC微处理器比标准的存储器部件还慢。它们也有一些多时钟周期完成的指令(在一些情况下,需要数百个时钟周期),使其有很长的中断等待时间。BBC微机很大程度上得益于6502的快速中断响应。因此,Acorn的设计者不愿意接受处理器性能方面 ...
堆漏洞系列(一)-- unsafe unlink
以前一直搞不明白unlink,直到学了点数据结构….
unlink分为向前合并和向后合并两种脱链方式,是为了减少堆块的碎片化所提出的,当一个处于free状态的堆块的前后堆块被free的时候,就是触发unlink机制将两个小的堆块合并成一个大的堆块,unsafe unlink问题就是出现在合并的时候检查没有到位导致的
wiki上的脱链示意图,当进行脱链的时候FD的bk指向BK,BK的fd指向FD
但是unlink也不是随便进行的,还需要通过下面的检查才能进行unlink,但在很早以前,它并没有这种机制,我们先通过介绍没有检查的情况,然后在此基础上进行修改,实现现在的unlink攻击手法
12345678910111213// 由于 P 已经在双向链表中,所以有两个地方记录其大小,所以检查一下其大小是否一致(size检查)if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0)) malloc_printerr ("corrupted size vs. prev_size& ...
MIPS PWN入门
2021HWS冬令营入营赛赛题–Mplogin
32位小端序,并且全红,xuanxuan老师说MIPS不支持NX,去查阅资料,没找到相关的文章,不过在复现RV110W的时候,它确实没有NX…
当然MIPS硬件本身也不支持NX机制
程序就两主要的函数,逻辑也很简单,经典read无截断泄露地址,这个地址是什么地址等下动态的时候在看
第二个函数就存在溢出,人家v2就20字节读了36字节,溢出到v3了都,下一个`read`的时候,就能无限制读,直接覆盖返回地址,劫持控制流,后面还有检查,注意一下就行...
开始调试…和X86不同,异架构的PWN就需要用到远程调试
1qemu-mipsel -g 1234 -L ./ ./Mplogin
-g :暴露调试端口
-L :在程序寻找动态链接库的时候优先在此目录下寻找
之后,我们就可以再启动一个窗口用gdb-mutilarch连接上我们的qemu暴露的调试接口,连接之后就可以进行调试啦!
12345gdb-multiarchset arch mipsset endian littletarget remote :1234c
再0x400 ...
RV110W路由器漏洞复现/2020年强网杯赛题
RV110W路由器漏洞复现
被xuanxuan老师种草了~,”一定要摸真实的设备”这句话余音绕梁,终于狠下心买了一个二手的RV110W,开始我的路由器漏洞复现之路,希望能学到点东西!
0x00 开端拿到路由器接上电源网线,电脑连接上RV100W就遇到了第一个问题,怎么进入后台?好吧,萌新没怎么玩过路由器,都是按照路由器背面的IP来登录,好巧不巧,它的背面很干净,啥都没有,看lemon师傅的视频看到10.10.10.1兴致冲冲的去访问,结果进了一个交换机的登录界面,奇了怪了,后来询问lemon师傅,要看路由器的网关IP进去,至此第一个问题顺利解决,初始密码是cisco:cisco
很顺利的进入后台,进入Administration => Firmware/Language Upgrade,看到固件的版本不对,是多少来着忘了,反正很老的一个固件,下面提供了固件的升级,我直接就拿xuanxuan老师的固件刷进去了,等了好一会,它就重启了,再次进入就发现固件版本已经变成1.2.2.5了
固件链接
0x01 信息收集到这,准备工作已经完成了!
那就开始真实环境下的漏洞复现了, ...
堆漏洞系列(二)-- tache bin attack
一直以来都是做libc-2.23的堆题,tache也很少涉及,这次来系统的看一下tache这个在libc-2.26版本中新引入的机制到底是怎么样的?它有什么奇妙的玩法?一起来看看吧
原理tache新增了两个结构体,一个是 tcache_entry ,另一个是tcache_perthread_struct
1234typedef struct tcache_entry{ struct tcache_entry *next;} tcache_entry;
12345typedef struct tcache_perthread_struct{ char counts[TCACHE_MAX_BINS]; tcache_entry *entries[TCACHE_MAX_BINS];} tcache_perthread_struct;
有两个特别重要的函数,是关于tache链入和脱链的操作,可以看到tache链入和脱链的检查十分的少,跟fastbin相比真的不多,甚至可以说没有检查…,所以说tache的存在让堆利用更简单了一点,所以说不要怕 ...