我想利用一个小程序。这个程序看起来有点像这样:
int func(void) {
char text[100];
scanf("%s", text);
return 0;
}
int foo(unsigned short rand) {
char RandomBuffer[rand];
return func();
}
int main(int argc, char* args[]) {
srand(time(NULL));
return foo(rand() % 1000);
}我使用ROPgadget构建了一个ROP链。该工具找到攻击所需的gadet:
Gadget found: 0x8058fcc pop edx ; ret我的ROP链是这样开始的:
p = ‘rnd padding’
p += pack('<I', 0x08058fcc) # pop edx ; ret但是,在执行我的漏洞时,我得到:
Stopped reason: SIGILL
0x08058fcc in _int_memalign ()EIP指向由ROPgadget计算的地址,但不知何故它不是正确的命令。
EIP: 0x8058fcc (<_int_memalign+108>: lock mov eax,esi)我遗漏了什么?
干杯
发布于 2017-07-13 02:42:47
如果没有进一步的分析,就很难确定这一现象的确切原因。一个常见的问题是,在调试器下运行应用程序会稍微改变内存布局,并且可以通过/不附加调试器就足以阻止攻击。您试过在没有附加调试器的情况下运行它,然后分析核心转储吗?
然而,pop edx;ret不应该太难找到,无论是在另一个地址,还是通过一个稍长的小工具(如pop edx; pop eax; ret )。组合一个ROP链是一个谜,有不止一种方法可以做到这一点。
发布于 2017-08-15 07:02:20
您可能缺少PIE/ASLR,它使加载程序在每次执行时都将可执行文件放置在不同的地址,这意味着每次执行时,您的小工具都会位于不同的地址。如果有方法禁用编译器,请查看它。例如,许多gcc建造的都是不吃馅饼的。如果没有,您可能可以禁用整个环境的ASLR。这在Linux的不同口味上是不同的,但最常见的方式(我相信)是
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'https://security.stackexchange.com/questions/163363
复制相似问题