构建 ROP 链时遇到问题

信息安全 缓冲区溢出 aslr
2021-09-09 01:03:50

我正在尝试利用一个小程序。该程序看起来有点像这样:

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)

我错过了什么?

干杯

2个回答

没有进一步的分析,很难确定造成这种情况的确切原因。一个常见的问题是,在调试器下运行应用程序会稍微改变内存布局,并足以在连接/不连接调试器的情况下破坏漏洞利用。您是否尝试过在没有附加调试器的情况下运行它,然后分析核心转储?

但是pop edx;ret,在另一个地址或通过稍长的小工具(例如pop edx; pop eax; ret. 将 ROP 链放在一起是一个难题,并且有不止一种方法可以做到。

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

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'