【问题标题】:Overflow attack to call function调用函数的溢出攻击
【发布时间】:2015-01-17 02:30:08
【问题描述】:

我有一个学校的作业(我不会问任何能给我答案的问题)

我们在c中得到了以下代码:

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char **argv ) {
char * stuff = 0;
int len = 0;

vulnerable();
return 0;
}

int vulnerable( void ) {
char buf[100];

printf("Please enter your hacker name: ");
fflush(stdout);
gets(buf);
printf("\"%s\"\n can hack this?" , buf );
}

void notcalled( void ) {
char *secret = "Iouf jmmb, cbsb sftufo lwbs!";
int i;

printf("The Secret string is: ");
for( i = 0 ; secret[i] ; i++ )
    if( secret[i] >= 'a' && secret[i] <= 'z' )
        printf("%c" , secret[i] -1 );
    else
        printf("%c" , secret[i] );
printf("\n");
}

我已经使用命令编译了程序:

gcc -fno-stack-protector -z execstack -o oflow oflow.c    

我想知道我是否“走上正轨”。

我做的第一件事是找到函数“notcall()”的地址,然后我在运行 gdb 时一直在查看堆栈并试图找出该地址的放置位置。

我也一直在使用以下 perl 脚本来溢出程序:

perl -e 'print "A"x312 ."\xb0\x85\x04\x08"' | ./oflow

(注意312只是一个例子)

我的问题是:如何找出将地址放在堆栈中的位置以及如何计算必须填充多少字节才能溢出。 (我不想要答案,我想要解决我问题的提示和技巧)

提前致谢!

【问题讨论】:

    标签: stack overflow stack-overflow


    【解决方案1】:

    要给出准确的答案,您确实需要提供易受攻击方法的反汇编,因为它会根据您运行的硬件而有所不同。

    函数调用通常由以下内容组成:

    1 Push arguments on to the stack.
    2 Call method.
    3 Clean up the stack.
    

    调用操作本质上是两条指令的组合:

    2.1 Push the address of line 3 onto the stack. 
    2.2 Jump to the address of the method being called.
    

    被调用的方法通常由以下内容组成:

    4 Create a stack frame for the method (something like below)
         push bp
         mov sp, bp
    5 Create space for local variables on the stack
         sub 0x64, sp
    6 Do stuff....
    7 Clean up the stack frame.
         mov bp, sp
         pop bp
    8 Return from the method.
         ret
    

    找出将地址放入堆栈的位置

    ret 指令将调用方法时压入的地址弹出到指令指针中。目标是更改此地址,而不是在第 3 行推送的指针指向您的 notcalled 方法。因此,您需要将地址放到刚刚超出方法堆栈框架的堆栈中。

    弄清楚如何触发溢出

    您可能已经知道,方法调用的脆弱部分是对gets 的调用。这会从stdin 获取输入并继续收集输入,直到它到达行尾。由于它不占用缓冲区大小,这意味着可以将更多字符传递给gets,而不是它指向的缓冲区可以容纳,因此您可以触发缓冲区溢出。

    计算溢出需要多少字节

    正如我上面所说,您通过过度填充缓冲区来触发溢出。因此,输入的大小将是(缓冲区大小)+(可能是任何其他局部变量)+(堆栈帧)的某个函数。您可以通过查看反汇编来解决这个问题,也可以通过一些试验和错误来了解您如何填充缓冲区并通过堆栈溢出它。

    【讨论】:

    • 抱歉没有及时表示感谢!真的帮了我!非常感谢你,很抱歉迟到的评论:)
    猜你喜欢
    • 2011-11-12
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2021-12-03
    相关资源
    最近更新 更多