Pwnable.kr WP

近期,开始将以前做的CTF的题目,全部整理一遍,写个WP,也是为了督促自己,还需要学的东西还有很多。

Pwnable.kr fd 

我们首先看到这道题的C源码:

需要得到flag,则需要执行

system("/bin/cat flag");

则 必须 buf = "LETMEWIN"。

read(fd, buf, 32)函数中的三个参数中:

fd == 0时:则表示标准输入;

fd == 1时:则表示 标准输出;

fd == 2时,则表示标准输出错误。

buf 表示读入的缓冲区;

32表示读入32字节;

所以我们 只需要 使 fd == 0 ,则我们就能自己输入 LETMEWIN 到 buf中。这样最终得到flag。

那么我们就要令

argv[1] = 0x1234

即 argv[1] = 4660


Pwnable.kr Collision

这道题主要是 我们输入的 20个 字符串 转换为 int 型之后,相加之后 要等于  0x21DD09EC。

我们先来了解一下 char 型 强制转换为 int 型 的方法:

如果我们输入的字符串是: 12345678, 则转换为 ASCLL码之后。每4位转为一个 int 型。 之所以 顺序改变是 因为 小端序的原因。

所以 我们 输入的 20个 字符串, 最终会 转换为 5个 int 型 数组, 刚好够加5次。

我们只需要 输入 5组 数,使其相加 为 0x21DD09EC 即可。

那么 我们 前4组数 使其 都为 0x02020202, 最后一组数 为 0xE401D519(此处因为小端序的原因会改变存储的顺序).


Pwnable.kr mistake

根据题目和提示,我们可以发现这道题的漏洞在与 运算符的优先性问题。我们可以看到如下代码:

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)

这段代码中,由于  比较运算符 优先级中 <  的优先级 高于  =  的优先级。也就是上述代码的执行顺序变为如下:

if( fd= (open("/home/mistake/password",O_RDONLY,0400) < 0 ))

而我们知道 open() 函数 打开一个文件成功之后,就会返回一个非零数值,那么 永远比 0大,所以比较之后,将会返回 false 也就是 0。 所以 最终 fd = 0;  而当 fd = 0 之后,我们以下的代码:

len=read(fd,pw_buf,PW_LEN)

此代码将会变为 stdin, 也即是读取用户输入,我们可以输入任意的数值。 所以我们可以如下输入:

pw_buf = 1111111111

pw_buf2 = 0000000000;

因为 pw_buf2 ^ 1111111111 = 1111111111;


Pwnable.kr shellshock

这道题,可以先对 shellshock有一定的了解:

https://blog.csdn.net/pygain/article/details/53969081

然后按照漏洞去执行 bash -c cat flag的命令即可


Pwnable.kr uaf

此题需要用到虚函数和堆的知识,博主对堆不太了解,只对虚函数有一定的了解,看了别人的WP,也只是了解一点,等以后有更深的知识了,再来补吧,下面放两篇我觉得写的挺详细的WP,供参考:

https://bbs.pediy.com/thread-224651.htm

https://blog.csdn.net/qq_20307987/article/details/51511230


Pwnable.kr cmd2

我们可以看到 这道题对我们输入的 grgv[1] 的进行了过滤,过滤掉了 / 、 ‘ 、 flag 等,那么我们要输入的参数原本为:

/bin/cat flag 就要进行绕过。

那么 flag 可以用适配符代替, 但是  /  怎么办呢?

pwd  命令是输出当前目录名的, 如果我们当前目录在根目录下,那么我输出的不就是 /  吗?

所以我们可以先进入到根目录,随后如下操作:

./home/cmd2/cmd2  '""$(pwd)bin$(pwd)cat $(pwd)home$(pwd)cmd2$(pwd)fl*""'

猜你喜欢

转载自blog.csdn.net/AlexYoung28/article/details/81624877