c - 通过输入指针地址欺骗C程序

标签 c security dbg

这仅用于学术用途。软件安全类(class)。 老师希望我通过输入一些东西(我猜是一个思考地址)来欺骗程序,以运行与 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;
    }
}

最佳答案

数组下标运算符a[b]相当于*((a)+(b))

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

因此,(0xbffff534 - 0x804a0d4)/sizeof(fptr) 的十进制值 (如果 sizeof(fptr) 为 4,771675416)应该可以工作。

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

关于c - 通过输入指针地址欺骗C程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33458681/

相关文章:

c - 使用堆/优先级队列表示有向加权图

c - 从套接字读取字符串时,write 打印额外的字符

security - 最佳安全/漏洞测试公司?

debugging - 使用 python-dbg 调试 Cython 失败,出现 undefined symbol : Py_InitModule4_64

c++ - 带条件的断点

c - 为什么在参数列表前加一个 "_"

c - 为什么要为一个 POSIX 函数包含多个 header ?

security - IntelliJ Package Checker 未发现漏洞

php - Phonegap Android 应用程序 - 保护数据流量

erlang - 为什么 dbg 返回 pid :tracer() differs from dbg:get_tracer()