反正是找手感,直接打开我扔了很久的pwnable.kr,之前写到random,那么这次就从这里开始
random
程序的逻辑很简单,让我们输入一个数值,程序用rand()生成一个随机数与我们的值异或,判断通过就cat flag,看起来很难完成,但实际上由于题目并没有设置随机数种子,所以每次的值都是一样的,我们只需要得到这个值就好了。
但是我找了很久…最后才发现原来服务器上其实是有gdb的,那么我们调试一下就好了,可以得到默认的值是0x6b8b4567
,异或一下输入就好了
input
1 |
|
分析
粗看得知,题目需要过五关才能获得flag,然后需要满足各种输入
- 需要有100个参数,同时第65、66个参数还需要满足特定的条件,因为中间有例如”\x00”、回车等字符,故我们在服务器上写个程序编译执行应该会方便一点,布局好之后用execve传参即可。
- 需要从stdin和stderr中获取字符串,但是这些字符串并没有办法直接从命令行输入,我们只能使用 I/O重定向来进行。这里需要fork一个子进程,然后用pipe实现。参考 linux编程之pipe()函数
- env的值默认是系统环境变量,这里我们可以指定env并通过API——execve(“input”,argv,env)传递。C 库函数 - getenv()
- 读文件,这里我们整一个这样的文件就行
- socket编程,这里我们需要建立套接字连接到server上并发送信息。
code
1 |
|
在/tmp下建一个我们的目录input,编写test.c并gcc test.c -o test
编译,注意该目录下没有flag,所以要先通过ln -s /home/input2/flag flag
来建一个软链接。
之所以新建目录而不是在tmp下操作是因为tmp目录我们本身也没有权限,这会限制最后一步的system(“/bin/cat flag”)。
ps:草tmp目录和input目录下全是大家的文件,亏tmp目录还特意限制了ls
参考:
http://yoursite.com/2021/04/18/pwnable-kr-%E5%86%99%E9%A2%98%E8%AE%B0%E5%BD%95-random%E4%B8%8Einput/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋!