ASLR和PIE的区别和作用
ASLR和PIE的区别和作用
ASLR的作用
首先ASLR是归属于系统功能的, aslr是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。
在传统的操作系统里,用户程序的地址空间布局是固定的,自低向高依次为代码区, BSS区,堆栈区,攻击者通过分析能轻易得出各区域的基地址,在此情况下,只要攻击者的 注入代码被执行,攻击者就能随意跳转到想到达的区域,终取得计算机的控制权,试想如 果一个程序在执行时,系统分配给此进程三个区域的基地址是随机产生的,每次该程序执行 都不一样,那么攻击者注入的代码即使被执行,也终会因为无法找到合法的返回地址而产 生错误,终进程停止,攻击者无法入侵,这就是地址空间布局随机化的基本思想。
在ASLR的实现中,系统将进程的 用户空间分为三个区域,可执行区,映射区和栈区,可执行区存放可执行代码,初始化数据 和未初始化数据,映射区包括堆,动态库和共享内存,栈区 ...
ARM的ATPCS调用约定
ARM的ATPCS调用约定ATPCS标准,可以理解为ARM是怎么使用堆栈的。
那么在此之前需要熟悉调用约定的知识。X86的栈操作知识等。
调用约定调用约定分为如下:
cdecl调用约定
该调用约定遵循以下规则
参数入栈顺序是从右向左
栈平衡是调用者来负责
stdcall 调用约定
入栈规则:参数从右向左入栈
栈平衡负责:被调用者负责
fastcall调用约定
参数入栈顺序:函数的第一个第二个参数通过ecx和edx入栈。x64的结构下还有r8 ,r9 (寄存器),剩余的参数则从右向左入栈。
栈平衡:被调用者进行栈平衡。(x64是调用者负责)
返回值的存放:
返回值放在EAX和RAX(x64)中
ARM调用约定ARM函数之间相互调用遵循的规则就是ATPCS(ARM-Thumb Procedure Call Standard)ATPCS主要是定义了函数调用时参数的传递规则以及函数的返回规则。它类似于X64下的fastcall调用。
它们有个共同的特点就是寄存器多,有大量寄存器可以使用。
传参方式
R0~R3是传递函数的第一个到第四个参数的,超出的部分从右向左通过栈传 ...
ARM环境搭建
ARM环境搭建1.安装qemu,multiarch,和依赖库12345apt-get install qemu-userapt-get install qemu-use-binfmt qemu-user-binfmt:i386apt-get install gdb-multiarchapt-get install qemu-user-staticapt install gcc-arm-linux-gnueabi gcc-aarch64-linux-gnu
2.安装对应架构的共享库,使用apt来搜索一下12apt search "libc6-" | grep "arm" # aarch64apt install libc6-arm64-cross
3.交叉编译1234567apt search "gcc-" | grep "arm" # aarch64apt install gcc-arm-linux-gnueabi# arm-linux-gnueabihf-gcc# aarch64-linux-gn ...
ARM汇编指令详解
ARM汇编指令详解ARM的编程模式和七种模式基本设定
架构(32位)
约定
Byte(字节):8bits
Halfword(半字) :16 bits (2 byte)
Word(字):32bits(4 byte)
指令集
ARM指令集(32位)
Thumb指令集(16位)
Thunmb指令集 (16位&32位)
工作模式
种类:七种
非特权模式(Normal:普通模式)
User (用户模式):非特权模式,大部分时候在这个模式下工作
特权模式(privilege:特权模式)
FIQ(快速中断模式):当一个高优先级(fast)中断产生时将会进入这种模式
IRQ(普通中断模式):当一个低优先级(normal)中断产生时会进入这种模式
SVC(管理模式):当复位或软中断指令执行时进入
Abt(数据访问终止模式):当存取异常时进入
und(未定义指令终止模式):当执行未定义指令时进入
sys(系统模式):使用和User模式相同的寄存器的特权模式
Privilege除了System模式外,其他几种为异常模式
各种模式的切换,程序员通过代码切换(CPSR寄存器); ...
ARM架构基本知识
ARM架构基本知识1.ARM架构的诞生1974年IBM提出了精简指令集计算机 (Reduced Instruction Set Computer )旨在通过减少指令的数量和简化指令的格式来提高CPU的指令执行效率。典型的代表有ARM处理器,MIPS处理器和DECAlpha处理器等。以ARM处理器为例子,1985年Acorn推出了基于ARMv1指令集的第一代ARM1处理器,2011年推出的ARMv8将指令集扩展到64位,称为AArch64,继承自ARMv7的指令集称为AArch32。在Linux发行版中,将AArch64称为aarch64,AArch32称为arm。由于RISC较高的执行效率以及较低的资源消耗。当前包括IOS,Android在内的大多数移动操作系统核嵌入式系统都运行在这类处理器上。
长期以来,CISC和RISC都处于你追我赶的竞争中,同时也在不断地相互借鉴对方的优点。从Intel P6系列处理器开始,CISC指令在解码阶段向RISC指令转化。将后端流水线转换成类似RISC的形式,即等长的微操作,弥补了CISC流水线实现上的劣势。同期,ARMv4也引入了代码密度更高的Thu ...
AFL++fuzz测试路由器固件
AFL++fuzz测试路由器固件前言在做fuzz的时候发现很多其实都是基于AFL工具的,以前学过一点AFL++的,但很久不用都忘记了,刚好再来测试一下路由器固件来加固一下
AFL++的使用环境搭建我就不讲了,这篇文章做了较为详细的介绍
https://c0ke.github.io/2024/07/10/AFL++fuzz%E6%B5%8B%E8%AF%95/?highlight=afl
使用如下命令进行测试
1afl-fuzz -M master -m none -x xml.dict -i /path/to/corpus -o output -- /path/to/xmllint --valid @@
-M 表示使用分布式fuzz
-m 表示子进程的内存限制,这里为0
-x 指定了模糊测试的字典
-i 表示测试用例的输入目录
-o 表示fuzz的结果输出目录
显示图如下
下面会详细介绍一下各个部分的含义
process timing :
run time: 已经运行的时间。
last new find: 上一次找到新的漏洞或问题的时间。
last saved crash ...
AFL++fuzz测试
AFL++fuzz测试概述AFL++是AFL的社区维护版本。它拥有更快的fuzzing速度,更好的变异策略、插桩性能和功能,以及支持各类自定义的模块。
AFL简介AFL(American Fuzzy Lop)是由安全研究员Micha? Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。
①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);②选择一些输入文件,作为初始测试集加入输入队列(queue);③将队列中的文件按一定的策略进行“突变”;④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。
选择和评估测试的目标开始Fuzzing前,首先要选择一个目标。 AFL的目标通常是接受外部输入的程序或库,输入一般来自文件(后面的文章也会介绍如何Fuzzing一个网络程序)。
1. 用什么语言编写AFL主要用于C/C++程序的测试,所以这是我们寻找软件的 ...
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=> ...
4. Linux权限维持_后门篇
Linux权限维持–后门篇本文将对Linux下常见的权限维持技术进行解析,知己知彼百战不殆。
1、一句话添加用户和密码
添加普通用户:
1234567891011# 创建一个用户名guest,密码123456的普通用户useradd -p `openssl passwd -1 -salt 'salt' 123456` guest# useradd -p 方法 ` ` 是用来存放可执行的系统命令,"$()"也可以存放命令执行语句useradd -p "$(openssl passwd -1 123456)" guest # chpasswd方法useradd guest;echo 'guest:123456'|chpasswd # echo -e方法useradd test;echo -e "123456\n123456\n" |passwd test
添加root用户:
12# 创建一个用户名guest,密码123456的root用户useradd -p `openssl passw ...
2024-mapna ctf -protector
2024-mapna ctf -protector前言小组任务,复现了国际赛mapna CTF的protector,一个有点难度的栈溢出ORW
分析保护分析123456[*] '/home/coke/桌面/CTFrecurrent/protector/chall' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)
只开启了堆栈不可执行
代码分析main函数如下
12345678910int __cdecl main(int argc, const char **argv, const char **envp){ char buf[32]; // [rsp+0h] [rbp-20h] BYREF disable_io_buffering(); printf("Input: "); init_sandbo ...