周杰伦 6/18/2023, 11:00:18 PM
文章分类 Pwn 阅读数 : 418 阅读时长 : 4分钟
本文记录入门patch时做的一些题目。
将rdi存储的字符串地址指向'%2d',0。 在eh_frame段构造字符串'%2d',0,'%2d'的hexstr表示为253264。 edit->patch programe->change bytes。 写入后。 在指令lea rdi, qword ptr [aD]处按ctrl+alt+k。将其改为mov rdi,offset 0x4020B0h,并patch。 修改后。
'%2d',0
'%2d'
lea rdi, qword ptr [aD]
mov rdi,offset 0x4020B0h
精简汇编指令,利用多余的nop直接修改汇编代码。源汇编代码。 题目中没有可以很好替代gets的指令,(可以自己试着修改汇编调用scanf函数)。这里将指令长度精简加工一下,利用多出来的nop指令来进行read系统调用。sys_read对寄存器要求,rax=0x0h;rdi=0(读入);rsi=[rbp+s](读取位置);rdx=0x100h(读入大小);。修改后。
nop
sys_read
rax=0x0h;rdi=0(读入);rsi=[rbp+s](读取位置);rdx=0x100h(读入大小);
与第二处gets()大同小异。
由于没有可替代的安全函数,所以在eh_frame段构造系统调用,先从call gets跳到eh_frame构造系统调用处的。 系统调用结束,跳回call _gets的下一条指令地址,0x08048515h。32位系统调用寄存器要求eax=0x3h(sys_read);ebx=0(读入);ecx=edx(读入位置,因为jmp到eh_frame前,edx保存的就是[ebp+var_4]的地址,所以这里直接把edx给ecx即可,但要注意先后顺序);edx=0x8h(读入大小);在eh_frame完成patch以后,可以按c建来查看汇编格式。
call gets
call _gets
0x08048515h
eax=0x3h(sys_read);ebx=0(读入);ecx=edx(读入位置,因为jmp到eh_frame前,edx保存的就是[ebp+var_4]的地址,所以这里直接把edx给ecx即可,但要注意先后顺序);edx=0x8h(读入大小)
将jle(有符号小于等于则跳转(同JNG))改为jbe(无符号小于等于则跳转(同JNA))。
jle(有符号小于等于则跳转(同JNG))
jbe(无符号小于等于则跳转(同JNA))
添加%sfomat到rdi,将buf改写到rsi。patch前。 eh_frame写入'%s',0 patch后
%s
'%s',0
更多【AWD_pwn_ptach记录】相关视频教程:www.yxfzedu.com