缓冲区溢出-设置要打印的相关文本

时间:2019-01-24 18:25:12

标签: c buffer-overflow shellcode

#include <unistd.h>

char shellcode[] = "???";

int main(int argc, char* argv[]) {
    int* ret;
    ret = (int*) &ret + 2;
    (*ret) = (int) shellcode;
}

启动此程序后,我必须更改shellCode变量才能在今年打印出来。 我理解此代码的方式是ret指向其先前的地址+ 2,并且它具有shellCode数组开始的地址的值。 但是在这种情况下堆栈看起来如何?我只是不了解main()中的代码含义以及这里的缓冲区溢出是如何工作的。

编辑 好的,我的问题并不像我想的那么明显。我只能更改shellcode内部的内容,不能对此代码添加任何内容(更改shellcode除外),输出应为2019(像输出其他所有数字一样进行处理,即2000,该数字将被硬编码)

2 个答案:

答案 0 :(得分:0)

启动该程序后,我必须更改shellCode变量才能在今年打印出来。

使用 strftime ,以下代码可用于用当前年份填充shellcode(如果创建的shellcode有足够的空间):

char shellcode[] = "0000"; //increase space for 4 characters + nul.

...  

time_t t;
struct tm* tm_info;
time(&t);
tm_info = localtime(&t);
strftime(shellcode, 5, "%Y", tm_info); //populate shellcode with year.
printf("%s\n", shellcode);             //write current year to stdout

正如我在评论中提到的那样,我不确定您在main函数中正在做什么,但是如果您打算获取当前年份的整数版本,则可以雏菊链式链接 strftime的字符串结果 strtol 函数将字符串转换为数字:

char *temp = null;
long int year = strtol(shellcode, &temp, 0); 

但是请务必检查转换错误。例如:

if(temp == shellcode|| ((year == LONG_MIN || year == LONG_MAX) && errno == ERANGE))
{
    //handle error
}

答案 1 :(得分:0)

该任务假定:

  1. 您使用int大小与指针相同的平台
  2. UB代码被编译
  3. 显然无用的代码将无法优化
  4. ret = (int*) &ret + 2;将指向堆栈上的返回地址
  5. 编译器不执行安全性运行时检查,因此不会阻止攻击

在这些情况下,您所需要做的就是获取指向将当前年份打印到shellcode变量中的函数的指针