试图利用ROP进行攻击时gdb和直接执行的不同行为

试图利用ROP进行攻击时gdb和直接执行的不同行为,gdb,reverse-engineering,exploit,Gdb,Reverse Engineering,Exploit,我最近学习了一些有关ROP的概念。 在一些提供源代码的网站上进行挑战时 #include <stdio.h> #include <string.h> int main (int argc, char ** argv){ char message[20]; if (argc != 2){ printf ("Usage: %s <message>\n", argv[0]); return -1; }

我最近学习了一些有关ROP的概念。 在一些提供源代码的网站上进行挑战时

#include <stdio.h>
#include <string.h>

int main (int argc, char ** argv){
    char message[20];

    if (argc != 2){
        printf ("Usage: %s <message>\n", argv[0]);
        return -1;
    }

    strcpy (message, argv[1]);
    printf ("Your message: %s\n", message);
    return 0;
}
堆栈是不可执行的,所以基本上我试图用系统libc函数的地址覆盖返回地址,不使用aslr。 我正在使用环境变量SHELL,我用gdb找到了地址。 消息地址和返回地址之间的距离为32字节。 所以我的外壳代码如下:'a'rep32++@ofSystem++'4byteJUNK'++@SHELL

问题是,当我直接使用这个外壳代码时,我得到了分段错误,因为成功调用了系统函数,但没有使用environment variable提供的方便参数/bin/bash,而是使用另一个不可打印的字符串调用它,但是,当我使用gdb时,我验证调用约定是否得到遵守,args是否在堆栈上传递,shell是否成功地使用一个类似的字符串/bin/bash调用。 我找不到检查问题根源的方法,因为在gdb上和没有gdb时的行为是不一样的

问题是,当我直接使用这个外壳代码时,我得到了分段错误,因为系统函数被成功调用,但没有使用方便的参数/bin/bash

我找不到检查问题根源的方法,因为在gdb上和没有gdb时的行为是不一样的

在GDB内部和外部运行程序之间可能有许多细微的差别

例如,GDB倾向于通过完整路径调用程序,即:

gdb a.out
(gdb) run
... invokes /full/path/to/a.out
环境,如$也可能不同

你需要更有创造力来解决你的问题。您可以尝试最小化差异,例如在GDB外部调用程序时使用/full/path/to/a.out,或者在GDB外部生成的内核中启用core dump和spelunk,这样您就可以了解不同之处,还可以找到在GDB下发现的距离—在GDB外部运行时,很可能会发生更改