0%

Heap Overflow

堆概述

在程序运行过程中,可以提供动态分配的内存;由程序本身而非编译器负责申请和分配;实际上是内存空间中一块连续的线性区域;由低地址向高地址方向增长;chunk是堆的最小操作单元。

堆的数据结构

如图,详情见这儿

堆溢出

向某个堆块中写入的字节数超过了堆块本身可使用的字节数,从而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块;

写人的字节要超过可使用的字节而不是用户申请的字节,因为堆管理器会进行调整。

于是,覆盖与其物理相邻的下一个chunk,然后利用堆的机制来实现任意地址写入或控制堆块内容,以达到攻击目的。

准备工作

进入IDA的安装目录,找到dbgsrv文件夹,将里面对应的文件导到linux中,我这里是linux_server64这个文件。

连接 调试

  • 在linux上将linux_server64运行起来
  • 打开IDA并加载要调试的程序
  • 选中IDA上的Remote Linux debugger
  • debugger->process options中设置进程设置(填的是远程(即linux)的文件目录及IP)
  • 点击OK然后设置好断点即可进行调试,所有输出都会在linux_server64的运行窗口显示

格式化字符串漏洞

常见的字符串函数

  • scanf:从stdin读入
  • printf:输出到stdout
  • fprintf:输出到指定FILE流
  • vprintf:根据参数列表格式化输出到stdout
  • vfprintf:根据参数列表格式化输出到指定FILE流
  • sprintf:输出到字符串
  • snprintf:输出指定字节数到字符串
  • syslog:输出日志
阅读全文 »

Buffer Overflow

ret2text

ret2text 即控制程序执行程序本身已有的的代码。

先找到可调用的函数地址,再用系列一技巧中的方法可以轻松算出覆盖24个a即可覆盖到返回地址,部分脚本如下。

1
2
bash = 0x0400607(此为调用系统shell的地址)
q = 'a'*24 + p64(bash)
阅读全文 »

工具安装

  • objdump
  • readelf
  • IDA Pro
  • GDB-PEDA
  • Pwntools (具体用法见这儿或者下图)

软件保护机制

  • ASLR

    内存地址随机化机制(address space layout randomization),有以下三种情况:

    • 0-表示关闭进程地址空间随机化
    • 1-表示将mmap的基址,stack和vdso页面随机化
    • 2-表示在1的基础上增加堆(heap)的随机化
阅读全文 »

加密算法

加密技术通常分为两大类:“对称式”和“非对称式”。

  • 对称式加密技术

    对称式加密就是加密和解密使用同一一个密钥,通常称之为”Session Key”。例如DES、AES、RC2、RC4…

  • 非对称式加密技术

    非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的”公钥”是指可以对外公布的,”私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难不把密钥告诉对方,不管用什么方法都有可能被别窃听到。而非对称式的加密方法有两个密钥,且其中的”公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。如RSA…

阅读全文 »

SQL注入漏洞

在设计程序时,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。SQL注入攻击通过构造巧妙的SQL语句,同网页提交的内容结合起来进行注入攻击。比较常用的手段有使用注释符号、恒等式(如1=1)、使用union语句进行联合查询、使用insert或update语句插入或修改数据等,此外还可以利用一些内置函数辅助攻击。被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。

  • SQL注入的位置包括:
    • 表单提交,主要是POST请求,也包括GET请求;
    • URL参数提交,主要为GET请求参数;
    • Cookie参数提交;
    • HTTP请求头部的一些可修改的值,比如Referer、User_Agent等;
    • 一些边缘的输入点,比如.mp3文件的一些文件信息等。
阅读全文 »

为了学习逆向等知识,先简单学习一下汇编

常见指令

  • 数据传送指令:MOV/XCHG,PUSH/POP,LEA
  • 算数运算类指令:ADD/ADC/INC,SUB/SBB/DEC/CMP/NEG,MUL/IMUL,DIV/IDIV
  • 位操作类指令:AND/OR/XOR/NOT/TEST
  • 控制转移类指令:JMP/JCC/LOOP,CALL/RET,INT n
  • 处理机控制类指令:NOP

脱壳

壳是软件逆向分析学的常见主题。为了理解好它,需要掌握有关PE文件格式、操作系统的基本知识(进程、内存、DLL等),同时也要了解有关压缩/解压缩算法的基本内容。

阅读全文 »

a、&a、*a

  • a表示存储单元中的数据
  • &a表示a对应的存储单元的地址
  • *a表示一个存储单元中的数据,其中a为存储单元地址

char a[ ]、char *a、char * a[ ]

字符串在编译器中也是一个地址(字符串的首地址)

  • char a[6]表示一个字符数组,大小为6个字节
  • char *a表示一个指针变量,只占4个字节
  • char * a[ ]中由于[ ]的优先级高于*,所以a先和[ ]结合。于是char * a[ ]表示一个数组,数组中的元素是char *
阅读全文 »