UAF漏洞(hitcontraining_uaf)
知识点学到这里感觉学的很乱,感觉什么都要去了解,但是什么都不是很了解,可能学到后面的点把这些知识点串起来就好了吧。
UAFuse after free顾名思义就是在这个chunk被free后面进行利用
当一个chunk被free后,这个函数内部的数据不会马上清除,这些数据会被保留在原来的位置,然后这个chunk会被标记为free后,并且会根据chunk的大小被分到不同的bin中去,有(fastbin,unsorted bin,large bin….)这些bin就是以链表的形势把这些free后chunk链在一起
例题下面以buu上面的hitcontraining_uaf进行说明
这个题目应该在glibc2.23环境中运行,但是这个题目大部分环境都可以打,就没改了
检查保护
ida打开
函数运行的时候会进行菜单选择
这里的delete函数中
这里可以看到free掉函数后面没有把函数的指针置零
因此这里存在漏洞
同时这个题目存在后门函数
先申请两个堆块
这个时候再free掉
free后面的bin
这个时候我们add(0x10,magic_addr)
因为在printf函数 ...
栈迁移(详解)
栈迁移我有罪,写错了好久才被发现(已更正)
原理
栈迁移主要利用了leave_ret这个指令
leave
返回上级函数时,恢复原本的栈空间
leave
mov esp,ebp pop ebp
ret
返回上级函数后,执行上级函数的命令
ret
等同于 pop eip (不存在这样的指令
ret是把栈顶的元素弹到rip中,之前这里没有理解,一直搞错了,抱歉
1234esp'''ebpret
在函数的先执行到leave指令时,会将ebp处填充的地址pop到ebp中去,这样栈基地址发生了变化,在下次的栈位置就会发生变化
有个图对这些指令变化阐 ...
羊城杯比赛pwn复现
首先推荐这个博客
本篇学习的思路来自这个大佬
实力有限,只复现出了pstack这一题
pstack
知识点这个题目是个很经典的栈迁移的题目,因为栈溢出的空间不够,但是常规的栈迁移一般有方法获得一个地址来进行leave_ret
这个题目有个很妙的点
这里call 完read后面有一个leave_ret(平时没注意过)
本题的核心就在于对这里进行反复利用
题解由于leave_ret这个指令
两次这样就可以控制rbp 和rsp
这里重点讲下调用vuln_read这个函数后面的过程
这里我们动态调试
123456789101112131415161718192021222324252627from pwn import *from LibcSearcher import *context(log_level='debug')p=process('./pwn')elf=ELF('./pwn')libc=ELF('./libc.so.6')bss=elf.bss()+0x500leave_ret=0x4006dbr ...
off-by-one
知识点通过堆块的错位来改变下个堆块的size位置,从可以改写指定的位置的函数
题目npuctf_2020_easyheap参考
64位 可以改写plt表
点开就是菜单
这个存在溢出漏洞
解法先创造两个chunk
通过改写chunk0(第一个)溢出通过溢出多一个字节(0x41)使得下面两个堆块整合到一起
接着free chunk1(第二个chunk)
再重新申请一个大小为0x38的块
可以看到之前的0x41申请回来了
这个发的是’a‘
利用上个改写41溢出导致下个堆块记录输入内容的地址发生变化
这里把那个地址改成了free函数
泄露libc通过题目里面的show函数泄露free处的libc
就是这个堆块的返回地址已经变成你指定的位置了,无论是输出还是改写就容易了
最后找到system 将free函数改成system加上前面写入的/bin/sh\x00EXP123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 ...
武功山杯pwn复现
穿云入雾这题nc连接后输入WuGongShan_i_Come
安源路矿
canary保护和NX保护
利用上面这个函数溢出一个泄露canary 还可以泄露在这里的rbp
这里泄露出来了
关键然后当我想正常走ret2libc的流程的时候发现在连接后会出现超时的情况
这个时候,在高人指点下(赛后)发现可以利用一种类似于栈迁移的方法,就是利用上面泄露的rbp将函数puts完后回到puts这里,puts出puts的got表,之后在进行one_gadget(ret2libc超时)
但是要注意这里的rbp有变化
read到puts rbp-0x50
最后exp如下
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465from pwn import *from LibcSearcher import *context(log_level='debug')libc=ELF('. ...
DASCTF 2024暑期挑战赛
springboard本地环境调试之前一直不理解为什么有的题目会给几个文件,现在才知道可以用来方便协调本地和远程的环境的
这里需要使用patchelf这个工具
修改ld
1patchelf --set-interpreter ./ld.so ./pwn(路径和文件)
ld.so 是要修改的 ./pwn是本地文件名
修改libc
1patchelf --replace-needed libc.so.6 ./libc.so.6 ./pwn
解题思路检查
可以看出非栈上格式化字符串漏洞
来到printf函数
可以看到
1处可以泄露libc 同时也是返回地址的所在地
两个2处可以利用这样的链式关系修改任意位置的地址
具体的手搓格式化字符串点这里格式化字符串 | 鱼非愚 (yufeiyu33.github.io)
exp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566from ...
[ZJCTF 2019]Login题解
这个题目主要考察了函数间的参数的的具体分析
先检查保护,有canary保护
在ida中静态分析一下
有个账号密码的输入和检查,漏洞一般就是在账号密码输入的地方
先运行看看什么情况
发现只要输入对了密码,就会出现这样的异常,在ida查看这个异常的函数
发现只要输入对了密码就会跳转到上面的函数
所以要来找找a1的来源
rax就是a1
也就是外面的&v7
点开
发现v7是rbp+var_18
rbp=rsp
在下面输入函数中
同样rbp=rsp
这两个函数见rsp的值是没有发生变化的
故可在密码处通过覆盖得到改变a1
计算偏移即可
0x60-0xf(2jctf_pa5sw0rd)-0x18=58
后面就是a1覆盖上bookdoor
exp1234567891011121314151617from pwn import *#p=process('./pwn')p=remote('node5.buuoj.cn',29903)elf=ELF('./pwn')bookdoor=0 ...
ret2dlresolve及例题
ret2dlresolveret2dlresolve主要是利用函数进行plt表进行动态链接的时候,通过一系列的跳转才能找到got表,就是利用的这个过程进行漏洞攻击
_dl_runtime_resolve函数调用参考:[原创]ROP高级用法之ret2_dl_runtime_resolve-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com
首先用link_map访问.dynamic,分别取出.dynstr、 .dynsym、 .rel.plt的地址
.dynamic的地址加0x44的位置是.dynstr.dynamic的地址加0x4c的位置是.dynsym.dynamic的地址加0x84的位置是.rel.plt
.rel.plt + 参数reloc_index,求出当前函数的重定位表项Elf32_Rel的指针,记作rel
rel->r_info >> 8作为.dynsym的下标,求出当前函数的符号表项Elf32_Sym的指针,记作sym
.dynstr + sym->st_name得出符号名字符串指针
在动态链接库查找这个函数的地址,并且把地址赋值给* ...
pwn漏洞修复
pwn patch栈read 32
在push 18h处右击 点击Assemble 将18h改成正常的无溢出的长度就好了
read 6464位的也是同理
找到溢出的函数将长度改合理
格式化字符串32法一 :若有puts的plt把printf改成puts即可
法二:需要改一个函数无用的函数改成write函数
12345678910.text:080485C0 win proc near.text:080485C0 ; __unwind {.text:080485C0 push 20h ; ' ' ; n.text:080485C2 push eax ; buf.text:080485C3 push 1 ; fd.text:080485C5 call _write.text:080485CA ...
reverse-壳与脱壳
壳壳分为两类
压缩壳:
UPX ASPack PECompact RLPack NSPack
保护壳、
ASProtect Armadillo EXECryptor Themida
手动脱壳参考这篇【BUUCTF】 reverse 新年快乐_buuctf 文件加壳和脱壳-CSDN博客