Raphael +
  • Stay hungry, Stay foolish.
  • albus.zly@gmail.com
    albus12138

    Xman Day0x04

    0x00 ELF文件介绍

    bss段

    IDA

    PLT和GOT

    0x01 Shellcode介绍

    shellcode功能

    0x02 堆栈寄存器介绍

    5-1

    调用函数

    函数返回

    如何控制EIP

    0x03 系统保护机制

    NX:数据执行防护 - 防止栈溢出 + 跳转到栈上执行Shellcode Canary:栈溢出防护 - 防止所有单纯的栈溢出 RELRO (ASLR):地址随机化 - 防止所有要用堆栈精确地址攻击,想要成功攻击需要提前泄露地址 PIE:代码地址随机化 - 防止ROP

    0x04 GDB

    c:恢复程序执行 finish:执行到函数退出 x:打印内存数据 p:打印表达式内容 command:断点出发时命令 step:单步步入 reverse-step:反向单步步入 next:单步步过 reverse-next:反向单步步过

    常用插件——peda: pattern_create pattern_offset pdisass checksec vmmap ropgadget goto find deactive

    exp脚本——pwntools

    0x05 格式化字符串漏洞

    一般来说,格式化字符串在利用的时候主要分为三部分:

    1. 格式化字符串函数
    2. 格式化字符串
    3. 后续参数、可选 技巧:%d 数字 / %x 十六进制 / %s 字符串 / %n 将已经打印的长度写入内存地址 / 定位 %11$x 打印第11个

    泄露内存:

    覆盖内存:

    常见格式化字符串题:

    0x06 ROP

    ROP的全称是返回导向编程,是一种高级的内存攻击技术,使用堆栈的控制来在返回之前立即或间接的执行挑选的指令,因为所有指令来自于原始程序的可执行代码,避免了直接代码注入的困难。

    ret2shellcode需要我们去控制程序执行我们的shellcode,常见功能就是获取系统shell,一般都是向栈中写入shellcode,返回跳转到shellcode,需要关闭NX (堆栈不可执行)。

    开启NX的情况下,使用re2libc构造ROP链,一般需要泄露system函数地址,并找到/bin/sh字符串 (ldd, 泄露)

    注意:只能泄露已经使用过的函数,因为动态链接库的加载是lazy原则

    GOT和PLT: 函数名就是一个地址——函数的入口,自己写的函数jmp过去就是函数本体,动态链接库使用lazy原则,用时加载,第二次就不用加载了。动态链接库中的函数在call的时候并不是在库中的地址,而是PLT表中的地址,在执行过之后就会将地址存入GOT表,下一次直接调用。

    ret2dl_resolve (待补充)

    Signal ROP (待补充)

    ROP64:

    0x07 栈溢出

    目的:覆盖返回地址,控制程序执行过程

    产生原因:栈溢出指程序输入字节超过了变量本身申请的字节数,程序向栈上写入数据&写入数据大小没有被良好的控制。

    计算溢出点:buf长度 + ebp长度 = ret偏移

    小总结:

    Blog

    Coding

    Bookmarks