花指令总结
花指令总结1、花指令介绍花指令的目的是干扰ida和od等软件对程序的静态分析。使这些软件无法正常的反汇编出原始代码。
2、常见的两类反汇编算法反编译器的工作原理一般是线性扫描反汇编算法或行进递归反汇编算法。
线性扫描反汇编算法:逐行反汇编,缺点是在于冯诺依曼体系结构下,无法区分数据与代码,从而导致将代码段嵌入的数据误解释为指令的操作码。以致最后得到错误的反汇编结果。
行进递归反汇编算法:按照代码可能的执行顺序进行反汇编程序。行递归算法通过程序的控制流来确定反汇编的下一条指令,遇到非控制转移指令时顺序徐进行反汇编,而遇到控制转移指令时则是从转移地址出开始反汇编。缺点在于准确确定间接转移目的地址难度较大。
3、花指令实现12345678910111213141516171819//源码#include<stdio.h>#include<windows.h>int main(int argc, char* argv[]){ int a = MessageBoxA(NULL, "Hello", "main", MB_OK ...
fastbin_attack综述
fastbin_attack综述介绍fastbin attack是指所有基于fastbin机制的漏洞利用方法。这类利用的前提是:
存在堆溢出、use-after-free等能控制chunk内容的漏洞
漏洞发生于fastbin类型的chunk中
如果细分的话,可以做如下的分类:
Fastbin Double Free
House of Spirit
Alloc to Stack
Arbitrary Alloc
其中,Fastbin Double Free和House of Spirit主要漏洞侧重于利用free函数释放真的chunk或伪造的chunk,然后再次申请chunk进行攻击,Alloc to Stack和Arbitrary Alloc侧重于故意修改fd指针,直接利用malloc申请指定位置chunk进行攻击。
原理fastbin attack存在的原因在于fastbin是使用单链表来维护释放的堆块的,并且由fastbin管理的chunk 即使被释放,其next_chunk 的 prev_inuse位也不会被清空。我们来看一下fastbin是怎样管理空闲chunk的。
si ...
Canary保护机制以及常用绕过手段
Canary保护机制以及常用绕过手段一、前言canary是一种用来防护栈溢出的保护机制。原理就是在函数入口处,先从fs/gs寄存器中取出一个4字节或者8字节的值存到栈上,当函数结束时会检查这个栈上的值是否和存进去的值一致。
在32位程序上是gs寄存器偏移0x14
在64位程序上是fs寄存器偏移0x28
一致则正常退出,如果是溢出或者其它原因导致canary的值发生变化,那么程序将执行__stack_chk_fail函数,从而终止程序
当程序开启canary保护之后,就不能正常的使用ROP劫持程序流程了,需要通过一定手段把canary的值泄露出来,之后重新布置ROP时就可以保证Canary值不发生变化,从而劫持程序流程。
二、绕过手段a、泄露栈中的canarycanary的本意设计低位为’\x00’,是为了截断字符串,防止被恶意泄露。所以泄露栈中canary的思路是覆盖canary的低位,把’\x00‘覆盖掉,这样就不会被截断,可以通过printf等函数泄露出canary。
泄露条件:
存在栈溢出漏洞
可以输出栈上缓冲区内容。比如printf打印变量的内容。
第一张是填充 ...
Chunk Extend/Overlapping | 堆拓展、重叠
Chunk Extend/Overlapping | 堆拓展、重叠参考资料123https://www.yuque.com/cyberangel/rg9gdm/kgwh10https://blog.csdn.net/qq_41202237/article/details/108320408https://blog.csdn.net/weixin_43921239/article/details/107841328
原理chunk extend技术能够产生的原因在于ptmalloc在对堆chunk进行操作时使用的各种宏。
在ptmalloc中,获取chunk块大小的操作如下
12345/* Get size, ignoring use bits */#define chunksize(p) (chunksize_nomask(p) & ~(SIZE_BITS))/* Like chunksize, but do not mask SIZE_BITS. */#define chunksize_nomask(p) ((p)->mchunk_size)
一种是直接 ...
ELF文件格式
ELF文件格式1、简介可执行与可链接格式(Executable and Linkable Format,ELF),常被称为ELF格式,是一种用于可执行文件、目标代码、共享库和核心转储的标准文件格式
ELF文件有三种:
可重定向文件(.o文件):包含基础代码和数据,但它的代码及数据都没有指定绝对地址,因此它适合与其他目标文件链接来创建可执行文件或者共享目标文件。
可执行文件(.out):包含代码和数据,是可以直接运行的程序。其代码和数据都有固定的地址(或相对于基址的偏移),系统可根据这些地址信息把程序加载到内存执行。
共享目标文件(.so):也称动态库文件,包含了代码和数据,这些数据是在链接时被链接器(ld)和运行时动态链接器(ld.so.l、libc.so.l、ld-linux.so.l)使用的。
2、ELF文件基本格式ELF文件有一定格式,从文件格式上来说,分别从编译阶段的链接视角和程序的执行视角去分析
从程序执行视角来看就是Linux加载器加载的各种Segment的集合。根据各种节的权限来分段,段就是相同权限的节的合并
从链接角度来看就是各种节section
ELF文件主要由 ...
PWN-栈保护机制
PWN-栈保护机制一、CANARY(栈溢出保护)栈溢出保护是一种缓解缓冲区溢出攻击的手段。当函数存在缓冲区溢出攻击漏洞时,攻击者可以通过覆盖栈上的返回地址来让shellcode能够执行。当启用栈保护后,函数开始执行的时候会往栈中插入cookie信息,当函数真正返回时验证cookie信息是否合法,如果不合法就会停止程序运行,从而防止攻击者覆盖返回地址的行为。攻击者在覆盖返回地址的时候往往也会讲cookie信息覆盖掉,导致栈保护检查失败,所以会终止程序来阻止shellcode的执行,在Linux中将cookie信息称为canary。开启栈溢出保护时,虽然不能覆盖canary信息,但是可以对canary的前面进行溢出。
GCC编译时的用法:
12345gcc -o test test.c // 默认情况下,不开启Canary保护gcc -fno-stack-protector -o test test.c //禁用栈保护gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码gcc -fstack-p ...
ret2csu
ret2csu一、x64寄存器123456789101112131415161718192021222324252627282930313233343563 31 15 7 0-----------------------------------------------------------------------------| %rax | %eax | %ax | %a1 |返回值+---------------------------------------------------------------------------+| %rbx | %ebx | %bx | %b1 |被调用者保存+------------------------------ ...
ret2libc1
ret2libc1一、原理ret2libc即控制函数执行libc中的函数,通常情况是返回至某个函数的plt处或者函数的实际地址(函数对应的got表项的内容)。一般情况下,会选择执行system(”/bin/sh“),所以需要知道system函数的地址
看C代码
123456789101112131415161718192021222324252627282930#include <stdio.h>#include <stdlib.h>#include <time.h>char *shell = "/bin/sh";char buf2[100];void secure(void){ int secretcode, input; srand(time(NULL)); secretcode = rand(); scanf("%d", &input); if(input == secretcode) system("shell! ...
ret2libc2
ret2libc2看C代码
123456789101112131415161718192021222324252627282930#include <stdio.h>#include <stdlib.h>#include <time.h>char buf2[100];void secure(void){ int secretcode, input; srand(time(NULL)); secretcode = rand(); scanf("%d", &input); if(input == secretcode) system("no_shell_QQ");}int main(void){ setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 1, 0LL); char buf1[100]; printf("Something surprise he ...
ret2libc3
ret2libc3先看C代码
123456789101112131415161718192021222324252627282930#include <stdio.h>#include <stdlib.h>#include <time.h>char buf2[100];void secure(void){ int secretcode, input; srand(time(NULL)); secretcode = rand(); scanf("%d", &input); if(input == secretcode) puts("no_shell_QQ");}int main(void){ setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 1, 0LL); char buf1[100]; printf("No surprise anymore, s ...