首页 文章

尝试利用ROP进行gdb和直接执行时的差异行为

提问于
浏览
0

我最近在学习关于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 .
我正在使用environement变量SHELL,我用gdb找到了地址 .
消息地址与返回地址之间的距离为32字节 .
所以我的shellcode如下:'a' rep32 @ofSystem '4byteJUNK' @SHELL

问题是当我用另一个不可打印的字符串调用时,但是当我使用gdb时,我验证调用约定是否被尊重(args在堆栈上传递),并且使用适当的字符串"/bin/bash"成功调用shell .
我找不到一种方法来检查问题的根源,因为gdb和没有gdb的行为是不一样的 .

1 回答

  • 0

    问题是,当我直接使用这个shellcode时,我得到分段错误,因为系统功能被成功调用但没有方便的参数“/ bin / bash”......我找不到一种方法来检查源代码问题是因为gdb和没有gdb的行为是不一样的 .

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

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

    gdb a.out
    (gdb) run
    ... invokes /full/path/to/a.out
    

    环境,例如 $_ 也可能不同 .

    你需要更有创意来解决你的问题 . 您可以尝试最小化差异(例如,在GDB外部调用程序时使用_39550),或启用 core dump,并在将在GDB外部生成的核心中插入,这样您就可以了解事物的不同之处(并找到距离)你在GDB下找到了 - 在GDB外部运行时可能会改变它 .

相关问题