BUUCTF刷题之路-rip1

首先我们下载源文件,一般pwn题会给一个二进制文件,有些堆题或者栈题会给对应的libc以便针对性利用。拿到一个二进制文件,我们首先就是使用IDA打开分析。一进来是这样的:

BUUCTF刷题之路-rip1_第1张图片

一般我们不看反汇编代码除非需要仔细分析的时候,直接F5看IDA翻译的C语言代码,这就是IDA的强大之处。能帮我们翻译成C语言代码,但IDA有时候也不一定准确,自己还是要有一定的分析能力。

BUUCTF刷题之路-rip1_第2张图片

上图这都是函数,带下划线的一般是系统提供的函数,我们分析前可以大致看看有哪些函数,都干了什么,对整体布局有个了解,我们一开始都回去分析main函数。BUUCTF刷题之路-rip1_第3张图片题目中我们看到这是个很简单的程序。就是输出一句话,接受用户的输入并打印出,然后打印ok,bye!

测试效果如下:

 我们从源代码看到有个危险函数gets,这个函数对边界没有检查,可以造成栈溢出。由此我们判断这题是一个栈溢出题目。接着我们在虚拟机环境下查看这个程序开启了哪些保护。BUUCTF刷题之路-rip1_第4张图片

 可以看到保护基本没开,是个很简单的栈溢出题目。我们可以看到NX是没有开启的。我第一反应是栈溢出构造shellcode,但是我们观察IDA下的函数找到一个fun函数

 BUUCTF刷题之路-rip1_第5张图片

 这相当于给我们留了一个后门。让我们能得到一个shell.那我们就找一下这个fun函数的地址,因为题目没有开启PIE,所以程序每次加载的地址都是不变的。这对我们利用又简单化了。

我们使用nm命令查看函数的地址:

 BUUCTF刷题之路-rip1_第6张图片

 我们得到地址0x401186,回到我们一开始的main函数中,是不是见到过一个char s[15],用户输入的就会放到s这个字符数组中。于是我们gdb调试下看一看。网上有很多教程交装pwngdb的大家可以搜索下,我自己也不太会装环境,每次都一堆报错。BUUCTF刷题之路-rip1_第7张图片

 我们把断点下到gets函数那。

然后run得到如下图:

BUUCTF刷题之路-rip1_第8张图片

 接着我们输入一个n让它执行一步,注意这里n是步过,s是步入。这两个命令大家要区分下

 接着我输入了15个A来验证我们的猜想,观察栈内的数据我们看到A已经被写入BUUCTF刷题之路-rip1_第9张图片

 我们去看下栈内存的布局。BUUCTF刷题之路-rip1_第10张图片

 因为A存入内存是以ASCLL码形式存在 0x41就是A,我们填入的15个A已经在栈上了,这个时候才到我们的rbp,我们还需要覆盖rbp+8的地址,这才是函数的返回地址,我们要做的就是覆盖这个返回地址,所以我们要填充23个字节然后加上我们构造的地址,指向我们的后门函数fun,至此这题就完成了。非常简单的一题入门栈。下面是完整的exp:为什么要加1这里涉及到栈对齐的概念,可以查阅资料我这里就不细说。

from pwn import *
sh=remote('node4.buuoj.cn',25021)
#sh = process('./pwn5')
buf2_addr = 0x401186
sh.sendline(b'A'*23 + p64(buf2_addr+1))
sh.interactive()

BUUCTF刷题之路-rip1_第11张图片

你可能感兴趣的:(pwn,CTF,c语言)