理应孤独

0x00

本人是厦门理工CodeMonster战队的选手White,因为队内缺少pwn手,使得我们在比赛中pwn部分得分一直没有起色,故我决定学习pwn来提升自己与战队。因为在网上没有找到多少系统性的pwn入门,故这篇即是我从零开始的pwn入门记录,也可以供大家参考。本人PWN也是从零入门,当中也许会有错误,还望各位师傅指点。


0x01

http://pwnable.kr/play.php 题目:fd
这是我入门做的第一道题目。让我们来看看这道题。

1.png

既然是从零开始 就要有从零开始的样子

题目中给了一句提示、教程地址、以及一个地址。

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

这是要让我们要用ssh连上如上地址的2222端口,密码为guest。

我个人是用虚拟机上的kali连接

2.png

(PS:输入密码的时候是不会有回显的)

成功连上该服务器,会显示pwnable.kr的图案

我们输入ls (linux下的查看当前位置所有文件的指令,详情参照另一篇文章)来看该目录有何东西

3.png

可以看到有三个文件 一个是fd.c编译后的可执行文件、一个fd的C语言源码,一个是flag

看到flag可能眼睛都亮起来了,然而我们要打开flag会提示"flag" [Permission Denied](权限不足)

所以我们要思考如何获得flag

打开fd.c

vi fd.c

4.png

分析代码

int fd = atoi( argv[1] ) - 0x1234;

fd的值指的是第一个输入的字符串参数转换成整型减去0x1234(16进制)
其中atoi()函数是将字符串转换成整型的函数。

strcmp
C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。

所以在此就是需要构造buf="LETMEWIN"

继续往下看fd的值在read中被调用

查阅read()的相关资料

From Wikipedia

The read system call interface is standardized by the POSIX specification.
Data from a file is read bycalling the read function:

ssize_t read(int fd, void *buf, size_t count);

即读取的系统调用接口由POSIX规范标准化。通过调用read函数来读取文件中的数据

然后我们想到题目给的提示——“Mommy! what is a file descriptor in Linux?”

查阅Linux file descriptor
//From Wikipedia
5.png

所以就要使用read()进行输入流——即要使fd=0

所以要使fd = atoi( argv[1] ) - 0x1234=0;

故输入的参数要等与0x1234 即十进制的4660

我们带参数运行fd(如图)在输入LETMEWIN即可获得flag
6.png


扫描二维码,在手机上阅读!

标签: none

已有 2 条评论

  1. Nepire Nepire

    读取文件内容的话一般用cat,只有需要修改的时候才会用vi或vim

添加新评论