-2

这仅用于学术用途。软件安全课程。老师要我通过输入一些东西来欺骗程序,我猜是一个指针地址,以运行与 f2 或 f3 不同的功能。我可以使用 GDB 查看所有内存地址。我应该输入什么来运行 f1?

感谢您的帮助。

void f1 (void) {...} // f1 address 0x8048559
void f2 (void) {...} // f2 address 0x804857e
void f3 (void) {...} // f3 adrress 0x8048627

fptr ptrs[2] = {NULL, f2, f3}; // ptrs adress 0x804a0d4

int main(int argc, char *argv[]) {
    char  buf[1024] = {0}; // buf address 0xbffff130
    int r; // r address 0xbffff530
    fptr p1 = f1; // p1 address 0xbffff534

    r = read(0, buf, sizeof(buf)-sizeof(char));

    if(r > 0) {
        buf[r] = '\0';
        int s = atoi(buf);
        fptr tmp = ptrs[s];
        tmp();
    } else {
        break;
    }
}
4

1 回答 1

3

数组下标运算符a[b]等价于*((a)+(b)).

指针和整数之间的加法将首先将整数乘以指针指向的类型的大小,然后将相乘的值和指针相加。

因此,(0xbffff534 - 0x804a0d4) / sizeof(fptr)771675416如果sizeof(fptr)是 4)的十进制值应该有效。

如果我是对的,使用该值,地址ptrs[s]应该是地址p1 并且使用tmp()函数f1将被调用。

于 2015-11-01T03:05:41.460 回答