pwnable.kr—cmd2
解题思路
同cmd1的writeup一样,一步一步解析问题:
delete_env();
此行清除了所有的环境变量;因此想在执行cmd2之前设置环境变量并利用变量绕过filter,那么这一步就是一个阻碍。另外要注意的是,extern char ** environ中environ是一个系统已经定义的变量,在此声明后即可使用,它的作用是指向环境变量。
if(filter(argv[1])) return 0;
此行以及已定义的filter函数要求输入命令中不能包含PATH、export、/、`、flag等字段。
于是还是想办法执行”/bin/cat flag”,并不能出现禁止出现的字符。
flag好说,可以用cmd1的技巧,使用f*通配符代替
难点在于”/”,不能使用。我是在看了writeup之后才知道的很多的解决方案。这里来一个很直观的思路吧。那就是我们可以用”/”的ascii码来代替这个字符,于是/bin/cat flag就可以写成”\057bin\057cat flag”,但是仿佛不能直接
./cmd2 "/057bin/057cat fl*"
至于原因我还没有找到…..
可使用
./cmd2 '$(printf \\057bin\\057cat) fl""ag'
拿到flag
遇到的问题
1.最大的问题就在于不会处理”/”!
收获
1.extern的知识点:
1.declarations can be done any number of times but definition only once.
2.extern–keyword:extern the visibility of variables/functions()
3.fucntions are visible through out the program by default; the use of extern is not needed in function declaration/definition, use of extern is redundant.
4.extern is used with a variable, only declare , not define
5.exception , extern variable declared with initialize—definition
2.linux下的21个特殊符号:
1.>:重定向输出符号;命令>文件名;不连续定向
2.>>:重定向输出符号
3.2>:错误重定向输出符号;特性:覆盖
4.2>>:错误重定向;追加
5.|:管道符号;用法:命令1|命令2;上一个命令的输出作为下一个命令的输入
6.*:匹配0个或多个任意any characters
7.?:匹配1个任意any characters
8.&:后台进程符
9.&&:逻辑与;命令1&&命令2;如果1成功则执行2;否则不执行2;
10.||:逻辑或;命令1||命令2
11.!:逻辑非
12.[x-y]:指定范围
13.#:注释
14.”“:把它包含的内容作为普通字符,但是‘’ $“除外
15.”:把它包含的内容作为普通字符,无例外
16.“(到引):执行它所包含的内容;命令;结合引号
17.\:转义字符;去掉特殊含义
18.$:变量调用符号
19.;:命令分隔符;顺序执行
20.():整体执行
21.{}:变量分隔符
22.<:重定向输入符号
3.输入重定向:用于改变一个命令的输入源;指把命令(或可执行程序)的标准输入重定向到指定文件中;输入可以不来自标准输入,而来自某个文件
4.read命令:从标准输入中读取一行
read [-p][-r][-s][-u[n]][variable name ? prompt][variable name]
如果标准输入字段数大于variablename数,则剩余存在最后一个shell变量;
如果标准输入字段数小于variablename数,则剩余的variablename为null
read命令设置的shell变量影响当前shell执行环境
5.command命令:调用指定的指令并执行;执行时不查询shell函数;只能执行shell内部命令;command命令导致shell将指定的命令和变量视为简单明了,禁止了shell功能查询。
command -p:使用PATH环境变量的缺省值执行命令搜索;查找所有命令
PATH缺省值:export PATH=/usr/local/sbin/:/usr/local/bin:/sbin:/bin:/usr/bin:/root/bin
6.rm命令:
rm -f -force 从不提示;忽略不存在的文件
rm -i -interactive交互式删除
rm -r -recursive参数中列出的全部目录和子目录递归删除
rm -v -verbose 详细显示步骤
仍存在的疑惑
1.set -s
2.使用ascii码来代替字符的时候为什么只能使用\0(八进制)而不能使用\x(十六进制)?
3.不能直接
./cmd2 '\\057bin\\057cat fl""ag'