BUUCTF刷题之路-rip1

23 篇文章 1 订阅

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

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

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

测试效果如下:

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

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

 

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

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

 

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

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

然后run得到如下图:

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

 接着我输入了15个A来验证我们的猜想,观察栈内的数据我们看到A已经被写入

 我们去看下栈内存的布局。

 因为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()

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值