pwnable.kr:input

Posted    on 2017, Jul28, Friday 17:31:43
Modified on 2017, Jul29, Saturday 12:09:12

Tags: pwnable.kr

题目

Mom? how can I pass my input to a computer program?

ssh input2@pwnable.kr -p2222 (pw:guest)

1. 分析

查看input.c后发现,题目看起来好像很简单,只要通过五个验证就好

2.题解

这个题如果使用pwntools来解决是十分方便的,不过借这题的机会,顺便介绍掉小姿势吧

1. stage 1

stage 1是关于参数的验证,下面是关于参数的一些小姿势

在参数中包含空格

如果执行以下的命令,程序input获得的参数分别为

./input '' '
' ' ' 4

argv[0] = “./input”

argv[1] = “”//空

argv[2] = “\n” //换行符

argv[3] = ” ” //空格

argv[4] = “4”

由上面的执行结果可以很容易的的得到一个结论,若是希望传递一些奇怪的东西,只需要给参数时加上引号即可

参数中包含不可见字符

执行

./input $(echo -e '\xbe')

$(xxx)代表将执行xxx后的输出作为文本加在此处

echo -e则代表将后面的文本进行转义,这样一来就可以在参数中传递不可见的字符了

从文件中读入数据作为参数

看了上面的例子后相信机智的人已经想出解决方法了

./input $(cat tmp)

这样既可将tmp中的文本作为参数传递了

但是,这样会遇上一些小小的问题

假设tmp中的文本为

'' '
' ' ' 4

执行上面的命令后input获得的参数为

argv[] = {“./input”, “””, “’”, “’”, “’”, “’”, “4”}

也就是说你的引号被当成了参数

解决这个的方法其实很简单,有个叫做eval的程序

eval: eval [参数 …]

将参数作为 shell 命令执行。

将 ARGs 合成一个字符串,用结果作为 shell 的输入,
 并且执行得到的命令。

退出状态:
 以命令的状态退出,或者在命令为空的情况下返回成功。

也就是说,执行

eval ./input $(cat tmp)

就可以得到希望得到的结果

2. stage 2

stage 2是关于输入的验证,其实就一个小姿势

dup2

有空填坑

剩下的 好像就没有什么东西了

附录

附件: input.zip