#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
,该数字将被硬编码)
答案 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)
该任务假定:
ret = (int*) &ret + 2;
将指向堆栈上的返回地址在这些情况下,您所需要做的就是获取指向将当前年份打印到shellcode
变量中的函数的指针