其他分享
首页 > 其他分享> > ctf pwn题patch方法(UAF)

ctf pwn题patch方法(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