ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ctf pwn题patch方法(UAF)

2022-07-02 12:02:17  阅读:308  来源: 互联网

标签:代码 free patch ctf call pwn 指针 rax UAF


ctf pwn题patch方法(UAF)

以ciscn2022华东南赛区一题为例,附件在文章末尾

漏洞在sub_1614函数,free之后指针没有置零

patch步骤如下:

修改.eh_frame section所在segment权限,使patch代码可以执行
  1. View->Open subviews->Segments查看.eh_frame section的地址,可以看到是0x1e00-0x2208

  2. 在IDA的反汇编窗口的头部找到.eh_frame 所在的segment,并把flags字段改成7(可读可写可执行)

patch代码

回到漏洞对应的代码,分析汇编代码。

首先获得全局数组unk_203080的地址放入rax,之后rax加上偏移rdx将该地址存放的指针赋给rax,此时rax就是要free的指针。为了patch我们自然要知道存放指针的地址,对应到汇编代码中就是在执行169c的代码前的rdx+rax。

.text:0000000000001695                 lea     rax, unk_203080
.text:000000000000169C                 mov     rax, [rdx+rax]
.text:00000000000016A0                 mov     rdi, rax        ; ptr
.text:00000000000016A3                 call    _free

所以我们从169c开始patch,首先jmp 到.eh_frame 地址,这里我使用的keypatch

.eh_frame section的汇编指令如下

add rax,rdx ;存放指针的地址
push rax
mov rax,[rax] ;free的指针
mov rdi,rax
call _free
pop rax
mov qword ptr [rax],0 ;指针置零
jmp loc_16a8 ;返回到原来的代码段

其中call _free和jmp loc_16a8 keypatch无法识别,需要换个写法。

对于call _free,可以写成call free@plt,在这里是 call 0x920

对于jmp loc_16a8改成jmp 0x16a8即可

之后Edit->patch program->apply patches to input file 保存patch

总结

其实patch总的来说就两种情况,一种是栈溢出整数溢出这种修改的代码比较少可以直接在原来的text段上修改的,另一种类似uaf这种需要改动代码比较多,这就需要跳到别的段执行patch代码然后再跳回去。

附件 提取码:bdhl

标签:代码,free,patch,ctf,call,pwn,指针,rax,UAF
来源: https://www.cnblogs.com/pluie/p/16436980.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有