CTF竞赛权威指南之汇编基础的学习
CTF竞赛权威指南之汇编基础的学习0x1 CUP架构与指令集0x1.1 指令集架构
最先诞生的是复杂指令集计算机(CISC),典型代表就是x86处理器。
后面1974年IBM提出了精简指令计算机(RISC)的概念。旨在通过减少指令的数量和简化指令的格式来优化和提高CPU的指令执行效率。典型代表是ARM处理器。
两种指令集的对比
大多数RISC的指令长度是固定的,对于32位的ARM处理器,所有指令都是4个字节,即32位;而CISC的指令长度是不固定的,通常在1到6个字节之间。固定长度的指令有利于解码和优化,可以实现流水线,缺点则是平均代码长度更大,会占用更多的存储空间。
基于80%的工作由其中20%的指令完成的原则,RISC设计的指令数量相对较少,或者说更简洁。
对于寻址方式,由于ARM采用了load/store架构,处理器的运算指令在执行过程中只能处理立即数,或者寄存器中的数据,而不能访问内存。因此,存储器和寄存器之间的数据交互,由专门的load(加载)和store(回存)指令负责。相反,X86既能处理寄存器中的数据,也能处理存储器中的数据,因此寻址方式更加多样 ...
CPU 的 ring0,ring1,ring2,ring3
CPU 的 ring0,ring1,ring2,ring3Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用。如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。
ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。
RING设计的初衷是将系统权限与程序分离出来,使之能够让OS更好的管理当前系统资源 ...
8080汇编手册数据传输指令
8080汇编手册数据传输指令一,机械码,又称机器码.ultraedit打开,编辑exe文件时你会看到许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码就是机器码.修改程序时必须通过修改机器码来修改exe文件.
二,需要熟练掌握的全部汇编知识(只有这么多)不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了cmp a,b 比较a与bmov a,b 把b的值送给aret 返回主程序nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)call 调用子程序je 或jz 若相等则跳(机器码74 或0F84)jne或jnz 若不相等则跳(机器码75或0F85)jmp 无条件跳(机器码EB)jb 若小于则跳ja 若大于则跳jg 若大于则跳jge 若大于等于则跳jl 若小于则跳jle 若小于等于则跳pop 出栈push 压栈
三,常见修改(机器码)74=>75 74=> ...
脏牛(DirtyCow)[CVE-2016-5195]复现
脏牛(DirtyCow)[CVE-2016-5195]复现前言本章主要是为了解决掉前面很疑惑的脏牛提权漏洞的原理,故复现了该漏洞,主要还是为了填坑吧,这篇文章只能说是对其他文章的转载加总结,大部分内容都源于参考链接,只是添加了我的部分思考
漏洞背景Linux内核的内存子系统的get_user_page内核函数在处理Copy-on-Write(写时拷贝,以下使用COW表示)的过程中,存在条件竞争漏洞,导致可以破坏私有只读内存映射。一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,有可能进一步导致提权漏洞(修改su或者passwd程序就可以达到root的目的)
漏洞名称:脏牛漏洞(DirtyCow)
漏洞编号:CVE-2016-5195
影响范围:Linux kernel >= 2.6.22(2007年发行,直到2016年10月18日才修复)
漏洞危害: 低权限用户利用该漏洞技术可以在全版本Linux系统上实现本地提权
主流发行版修复之后的内核版本,如果你的内核版本低于列表里的版本,表示还存在脏牛漏洞。
Centos7 /RHEL7
3.1 ...
docker逃逸的几种方法
docker逃逸的几种方法前言获取某个系统 shell 后发现其是 docker,这时候我们就需要进行 docker 逃逸来拿到其真正宿主的权限。这里提供几种思路。
利用 dirty cow 来进行 docker 逃逸
cve-2019-5736
利用特权模式逃逸
利用 dirty cow 来进行 docker 逃逸前置知识docker与宿主机共享内核,如果要触发这个漏洞,需要宿主机存在dirtyCow漏洞的宿主机。
VDSO 其实就是将内核中的.so 文件映射到内存,.so 是基于 Linux 下的动态链接,其功能和作用类似与 windows 下.dll 文件。
在 Linux 中,有一个功能:VDSO (virtual dvnamic shared object), 这是一个小型共享库,能将内核自动映射到所有用户程序的地址空间,可以理解成将内核中的函数映射到内存中,方便大家访问。
利用 dirty cow 与 VDSO 来实现 docker 逃逸的过程dirty cow 漏洞可以让我们获取只读内存的写的权限,我们首先利用 dirty cow 漏洞写入一段 shellcode 到 ...
异架构刷题记录
异架构刷题记录2022安询杯babyarm分析流程可以发现,就是一个变表base64加密,然后异架构的栈溢出罢了
12345678910111213141516171819202122232425int sub_10B60(){ unsigned int v0; // r0 int result; // r0 char v2[32]; // [sp+0h] [bp-2Ch] BYREF void *s; // [sp+20h] [bp-Ch] void *buf; // [sp+24h] [bp-8h] buf = malloc(0x80u); printf("msg> "); read(0, buf, 0x80u); s = malloc(0x200u); memset(s, 0, 0x200u); v0 = strlen((const char *)buf); base64((int)buf, v0, (int)s); printf("res> "); puts((const char *)s ...
PWN异架构学习-ARM架构题型
PWN异架构学习-ARM架构题型前言学习了一下国资师傅的pwn异架构教程,有很多异架构的题,这里自己做一遍复现一下
ret2libc这些题主要是为了回顾x86架构下的利用方法和ARM架构的结合下的使用。
解题过程通过分析发现存在栈溢出漏洞
1234567891011int dofunc(){ int buf[3]; // [sp+0h] [bp-Ch] BYREF buf[0] = 0; buf[1] = 0; write(1, "input:", 6u); read(0, buf, 0x100u); write(1, "byebye", 6u); return 0;}
exp1国资师傅的利用方法是ret2csu去泄露libc然后执行system(“/bin/sh”)。由于ARM架构是通过POP PC来返回的,一般arm架构都是通过ret2csu(ret2csu用的多)去解,下面是exp
1234567891011121314151617181920212223242526272829303 ...
PWN异架构学习-AARCH64架构题型
PWN异架构学习-AARCH64架构题型前言在学习完ARM架构后,继续学习AARCH64架构的题型,国资师傅说,相比arm架构,AARCH架构才更加能够称为异架构
ret2libc-ARRCH相比起ARM和X86架构,ARRCH架构在函数调用时候的栈的保护措施是不一样的,栈的返回地址和上一个栈帧的栈底是在当前栈帧的低地址,于是我们在进行栈溢出的时候是不能覆盖我们当前栈帧的返回地址的。
解题过程通过分析发现存在栈溢出漏洞
12345678910__int64 dofunc(){ __int64 buf; // [xsp+18h] [xbp+18h] BYREF buf = 0LL; write(1, "input:", 6uLL); read(0, &buf, 0x100uLL); write(1, "byebye", 6uLL); return 0LL;}
exp国资师傅的利用方法是ret2csu去泄露libc然后执行system(“/bin/sh”)。但是由于我们无法覆盖当前栈帧的返 ...
IO_FILE做题总结_W
IO_FILE做题总结前言在调试IO_FILE类型的题的时候总结的知识点
关于IO_FILE的libc更换在调试IO类型的题的时候,在之前我们需要换libc,因为一般题目给的libc都是没有符号表的,于是我们寻找一个与之对应的有符号表的libc即可,最好是一样的
没有一模一样的带符号的libc的,相同版本号的也可以
IO_FILE结构体查看有时候我们在分析IO的时候有对应的结构体可以看是最好的,这样我们就能明确知道我们改了哪些数据,这也是我们为什么要换libc的原因
自带的符号表变量如果是libc里面本身就有的符号,下面的命令可以直接打印出结构
1p [*_IO_list_all]
可以看到输出结果如下
根据不同的结构体的属性,前面添加* ,&, 不加,有不同的效果
修改后的不会自动识别的地址有时候我们需要将IO_FILE的结构体或者JUMP表的结构体的地址更改,但是这种时候直接打印地址是不会自动转换为结构体的
于是我们就需要自己去加
例如我要查看我伪造的IO_FILE结构体对不对,用下面这个命令去定义即可
1p *(struct _IO_FILE_plus *) ...
IO_FILE做题总结
IO_FILE做题总结前言在调试IO_FILE类型的题的时候总结的知识点
关于IO_FILE的libc更换在调试IO类型的题的时候,在之前我们需要换libc,因为一般题目给的libc都是没有符号表的,于是我们寻找一个与之对应的有符号表的libc即可,最好是一样的
没有一模一样的带符号的libc的,相同版本号的也可以
IO_FILE结构体查看有时候我们在分析IO的时候有对应的结构体可以看是最好的,这样我们就能明确知道我们改了哪些数据,这也是我们为什么要换libc的原因
自带的符号表变量如果是libc里面本身就有的符号,下面的命令可以直接打印出结构
1p [*_IO_list_all]
可以看到输出结果如下
根据不同的结构体的属性,前面添加* ,&, 不加,有不同的效果
修改后的不会自动识别的地址有时候我们需要将IO_FILE的结构体或者JUMP表的结构体的地址更改,但是这种时候直接打印地址是不会自动转换为结构体的
于是我们就需要自己去加
例如我要查看我伪造的IO_FILE结构体对不对,用下面这个命令去定义即可
1p *(struct _IO_FILE_plus *) ...