exploit编写学习阶段性总结

我怕爱的太早我们不能终老 提交于 2019-12-06 13:15:57

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 espjmp [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时使用类似打印字符串的方式,非法字符被打印成”?”。

如有错误还望指正,欢迎讨论:)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!