【发布时间】:2019-05-10 15:37:51
【问题描述】:
我最近在学习一些关于 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字节。
所以我的shellcode如下:'a' rep32 + @ofSystem + '4byteJUNK' + @SHELL
问题是,当我直接使用这个 shellcode 时,我得到分段错误,因为系统函数被成功调用,但没有使用环境变量提供的方便参数“/bin/bash”,它被另一个非可打印的字符串,但是当我使用 gdb 时,我验证调用约定是否得到遵守(参数在堆栈上传递),并且使用适当的字符串“/bin/bash”成功调用了 shell。
我找不到检查问题根源的方法,因为在 gdb 和没有 gdb 上的行为是不一样的。
【问题讨论】:
标签: gdb reverse-engineering exploit