首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立ROP链时遇到麻烦

建立ROP链时遇到麻烦
EN

Security用户
提问于 2017-07-04 11:24:18
回答 2查看 1.3K关注 0票数 9

我想利用一个小程序。这个程序看起来有点像这样:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 Gadget found: 0x8058fcc pop edx ; ret

我的ROP链是这样开始的:

代码语言:javascript
复制
p = ‘rnd padding’
p += pack('<I', 0x08058fcc) # pop edx ; ret

但是,在执行我的漏洞时,我得到:

代码语言:javascript
复制
Stopped reason: SIGILL
0x08058fcc in _int_memalign ()

EIP指向由ROPgadget计算的地址,但不知何故它不是正确的命令。

代码语言:javascript
复制
EIP: 0x8058fcc (<_int_memalign+108>:    lock mov eax,esi)

我遗漏了什么?

干杯

EN

回答 2

Security用户

发布于 2017-07-13 02:42:47

如果没有进一步的分析,就很难确定这一现象的确切原因。一个常见的问题是,在调试器下运行应用程序会稍微改变内存布局,并且可以通过/不附加调试器就足以阻止攻击。您试过在没有附加调试器的情况下运行它,然后分析核心转储吗?

然而,pop edx;ret不应该太难找到,无论是在另一个地址,还是通过一个稍长的小工具(如pop edx; pop eax; ret )。组合一个ROP链是一个谜,有不止一种方法可以做到这一点。

票数 1
EN

Security用户

发布于 2017-08-15 07:02:20

您可能缺少PIE/ASLR,它使加载程序在每次执行时都将可执行文件放置在不同的地址,这意味着每次执行时,您的小工具都会位于不同的地址。如果有方法禁用编译器,请查看它。例如,许多gcc建造的都是不吃馅饼的。如果没有,您可能可以禁用整个环境的ASLR。这在Linux的不同口味上是不同的,但最常见的方式(我相信)是

代码语言:javascript
复制
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/163363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档