exploit编写学习阶段性总结
tags: 漏洞利用 tips
0x00 跳至shellcode
现在学习的内容仅涉及利用。
已知:触发崩溃的方式
过程:
1、验证崩溃,观察是否覆盖EIP或异常链节点。
2、确定覆盖EIP或异常链节点在输入中的偏移,并验证。
3、使EIP最终跳转至payload。
跳转至payload的方法:
1、若EIP被修改时,有寄存器指向缓冲区。可使用 call/jmp [reg]
,push ret
。
2、若有缓冲区范围内的地址在栈顶上方,则可通过pop ret
(SEH)
3、以上两种都可用jmp [reg+offset]
代替(虽然这种指令不好找…)
以上方法有一个共同点:崩溃现场能够找到缓冲区内地址。(寄存器或寄存器指向的内存附近)
如果没现成的地址使用,可以自己硬编码一个。该值可能会被读入寄存器中,可能会在栈中。之后使用上面的方法跳转至payload。
某些长度下payload长度有限,而缓冲区覆盖的范围很大。此时可以在payload处写一段跳转代码,将功能代码放在缓冲区其他位置。
常用的方法有:
1、上面跳转至payload的方法。(这时自己编码,所以offset能够控制)
2、popad
+ jmp esp
(jmp [esp+offset]
的情况)
3、jmp [reg+offset]
, jmp [addr]
(硬编码)
有很多跳转指令可以互相替换,比如jmp esp
的机器码为\xff\xe4,\xff字节在一些程序中不能使用。此时应用其他等效的字节码代替。
最后再总结一下shellcode工作的流程:
1、覆盖EIP。
2、跳至payload。
3、payload可能为一小段跳转指令,此时跳至另一个payload。
4、执行功能。
硬编码地址的位置:覆盖EIP所用的地址,第一次跳至payload时硬编码地址。
tips:跳转指令分为短跳转和长跳转(短跳转只占两字节),又可分为条件跳转和无条件跳转。
0x01 exploit编写过程
1、确定EIP或SEH链节点被覆盖。
2、用pattern_create和pattern_offset确定覆盖EIP/SEH链节点的偏移。
3、修改该偏移处的值,检查偏移量是否正确。
4、使用某种方法跳至缓冲区内,跳转地址处第一个字节用\xcc覆盖。运行程序,观察崩溃后是否停在int 3
处。
5、将\xcc改为payload代码。
tips:
shellcode读入程序后可能会被修改或截断。
0x02 tips:
1、VS中对内存视图的优化
一开始在VS中用内联汇编写shellcode,提取shellcode的代码如下。
unsigned char * shellcode_byte = (unsigned char*)shellcode;
shellcode_byte += *(unsigned long *)(shellcode_byte + 1) + 5;
printf("shellcode address: 0x%08x\n", shellcode_byte);
for (index = 0, printf("unsigned char payload[] = {\n");;)
{
if (index == 10) // 每10个一行
{
printf("\n\t");
index = 0;
}
else if (index == 0)
{
printf("\t");
}
printf("0x%02x, ", *shellcode_byte++);
index++;
if (*shellcode_byte == 0xc3) // 以ret为结束标志
{
printf("0x%02x\n};\n", *shellcode_byte);
break;
}
}
运行时却出错了。
程序打印的函数地址跟VS调试器显示的一致。最初四个字节都为\x33\xc9\x51\x6a。但提取的字节数似乎超了。进一步观察,会发现代码并未检测到shellcode()函数的ret指令,在打印出\x83\xc4\x0c后直接打印\xcc\xcc……
数了一下\xcc的个数,会发现程序打印出的\xcc与VS内存视图显示的\xcc个数不同,差1个(8个和7个)。\xcc是中断指令,而ret指令处正好下了断点。
试着将断点去掉,结果程序运行正确。
2、CreateProcess() Get_Last_Error() == 2
在练习使用jmp [esp+offset]
方法进行二次跳转时,payload代码运行失败。但直接在第一次跳转后执行payload便能正常运行。运行失败时错误代码为2,系统找不到指定文件。莫名其妙的错误提示…
之后发现,jmp [esp+offset]
中的offset不是4的整数倍。将其修改为4的倍数即可。
3、.m3u文件中的shellcode读入后被修改为0x3f
使用.m3u文件溢出播放器时,出现shellcode读入后被修改的情况。对于一些序列会修改为\x3f。
- m3u文件格式如下:
- 一个绝对路径;比如:C:\My Music\Heavysets.mp3
一个相对路径(相对于M3U文件的路径);比如:Heavysets.mp3
一个URL
用于溢出的.m3u文件指定了一个URL,于是使用URL 3f
作为关键字进行搜索,查到”?”会被编码为%3f。
被修改为\x3f的字节为不可显示字符。所以猜测程序读取URL时使用类似打印字符串的方式,非法字符被打印成”?”。
如有错误还望指正,欢迎讨论:)
来源:CSDN
作者:Le9a1High
链接:https://blog.csdn.net/Le9a1High/article/details/43833751