ROP 4

发布日期:2019年02月26日 类别:pwn 题目来源:picoctf-2013 题目链接:https://github.com/picoCTF/picoCTF-2013-problems/tree/master/ROP%204

这道题是 PicoCTF 2013 ROP 系列的最后一题:

点击此处显示 Writeup
点击此处隐藏 Writeup

首先 file 一下这个程序:

dontpanic@Ubuntu:~$ file rop4
rop4: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=58db790a742bb1b283bc3301fa309bf5f4e23b27, not stripped

它是静态链接的、非位置无关的可执行文件,因此不会有 ASLR 的问题。execlp 的原型如下:

第一个参数是文件路径,第二个参数是 argv[0],也就是程序名称。第二个参数比较随意,我们传入与第一个参数相同的字符串就可以了。这个函数还需要最终传入一个 NULL 用来结尾。

下面要解决的就是 “/bin/sh” 应该如何构建。

使用现有的 /bin/sh 字符串

radare2 搜索一下就会发现,我们仍然有现成的 “/bin/sh” 可以利用:

[0x08048df8]> iz | grep bin/sh
382 0x00083f4f 0x080cbf4f   7   8 (.rodata) ascii /bin/sh 

因此可以直接构造出如下命令进行爆破:

构造出 /bin/sh 字符串

如果没有现成的字符串怎么办呢?也有办法,我们可以自行构造出 “/bin/sh”。首先 call_me_with_two_args 中,已经向 exec_string 拷贝了 /bin;我们下面要做的就是在后面接上 /sh,这可以通过调用 strcpy 来实现;然后我们就可以直接调用 exec_the_string 函数了。

首先看一下 call_me_with_two_args

溢出后的第一个目标就是跳到 0x08048f23,先填充上 “/bin”

然后向下执行,会 pop 一下 ebp,这个我们随便填上点东西就可以了;然后 call_me_with_two_args 返回,我们需要它返回至 strcpy,同时还需要构造 strcpy 的参数:

首先先来确定 strcpy 的地址。在 r2 中查一下符号:

[0x08048df8]> is | grep strcpy
513 0x000260c0 0x0806e0c0  LOCAL   FUNC  139 __strcpy_ia32
881 0x00026070 0x0806e070 GLOBAL   LOOS   69 strcpy
1687 0x0002aa40 0x08072a40 GLOBAL   FUNC 6219 __strcpy_ssse3
1864 0x00030670 0x08078670 GLOBAL   FUNC 1509 __strcpy_sse2

上面的 strcpy 只是一个入口,会根据 CPU 的不同特性返回不同实现的地址(而不是继续调用实现函数),因此这个并不是我们想要的。我们可以直接调用 __strcpy_ia32

至于参数,第一个参数自然就是 exec_string + 4,第二个参数是 /sh 的地址。

在上面的命令中,还有一块 \x??\x??\x??\x?? 没有确定,这是 strcpy 函数的返回地址。这里直接填入 exec_the_string 函数的地址即可。因此完整的爆破命令为:

dontpan1c 的 CTF 笔记
南阳一出即相,淮阴一出即将。

知识共享许可协议

本站所有作品均采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本站不包含明令禁止公开解题过程的题目。

本站由 Jekyll 强力驱动。