ctf pwn题patch方法(UAF)
作者:互联网
ctf pwn题patch方法(UAF)
以ciscn2022华东南赛区一题为例,附件在文章末尾
漏洞在sub_1614函数,free之后指针没有置零
patch步骤如下:
修改.eh_frame section所在segment权限,使patch代码可以执行
-
View->Open subviews->Segments查看.eh_frame section的地址,可以看到是0x1e00-0x2208
-
在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