冲冲冲

2018年5月

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

0x00

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


0x01 什么是PWN?

Wikipedia:

在骇客行话里,尤其在另外一种电脑技术方面,包括电脑(服务器或个人电脑)、网站、闸道装置、或是应用程序,"pwn"在这一方面的意思是攻破("to compromise",危及、损害)或是控制("to control")。在这一方面的意义上,它与骇客入侵与破解是相同意思的。例如某一个外部团体已经取得未经公家许可的系统管理员控制权限,并利用这个权限骇入并入侵("owned" 或是"pwned")这个系统。

Pwn 题目主要考察二进制漏洞的发掘和利用,需要对计算机操作系统底层有一定的了解。在CTF比赛中,PWN题目主要出现在 Linux 平台上。题目一般会提供一个地址,这个地址的端口上挂着你需要解决的题目。有时候出题者会提供题目源码,有时不会提供。需要解题者想办法通过逻辑或者漏洞来解决问题。

0x02环境和工具的准备

# Linux系统

# python环境 https://www.python.org/downloads/

# netcat安装 https://eternallybored.org/misc/netcat

# 将netcat的路径添加到系统变量中让我们可以使用cmd来打开nc

系统设置-环境变量-系统变量(path)-新建-选择netcat的路径

# pwntools安装 https://docs.pwntools.com/en/stable/install.html

pip install pwntools

安装好后测试一下是否成功

form pwn import  *

# IDA Pro(F5大法好)

未完待续。。。