我最近在学习关于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 回答
在GDB内部和外部运行程序之间可能存在许多细微差别 .
例如,GDB倾向于通过完整路径调用程序,即:
环境,例如
$_
也可能不同 .你需要更有创意来解决你的问题 . 您可以尝试最小化差异(例如,在GDB外部调用程序时使用_39550),或启用
core
dump,并在将在GDB外部生成的核心中插入,这样您就可以了解事物的不同之处(并找到距离)你在GDB下找到了 - 在GDB外部运行时可能会改变它 .