[BUUCTF]pwn栏目 ciscn_2019_n_1的题解和小疑问,欢迎讨论(0x01)

0x00

欢迎来到Sevn和N1nE的第二篇博客~~!
这是本人第一次不看题解解出来的pwn题,故怀着非常激动的心情写下这篇~

//由于题目类型相同
//所以大家看起来文章可能会似曾相识,
//不过不用在意,总会有新的内容的~

老规矩~

小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~
提示,Q2在c语言代码块引用中

0x01 题目来源

题目来自buuctf的pwn栏目第四题ciscn_2019_n_1
依旧是一道栈溢出的基础题目,加了一点难度但实际上没加。

buuctf网址:https://buuoj.cn/challenges

0x02 题解

1.分析文件

第一步:file 文件名

老规矩,当我们下载附件以后,在linux的命令行里输入如下命令,得知是64位且是elf可执行文件。
(Q1:其他信息尚不知有什么作用,依旧欢迎补充)

为了方便我还是拖入自己的pwn文件夹之后将其重命名为ciscn,此命令即“file 文件名”,即可查看文件相关信息

第二步:checksec 文件名

我们继续使用checksec看看这个文件的保护情况。
在这里插入图片描述

此文件受到了NX保护,我特地为此去了解了一下NX的保护机制。目前只知道其能防止攻击方利用栈溢出执行shellcode,但是仍然有疑惑(Q2所在)。

其函数如下

(同是小白的同学不要被吓倒,做这道题并不需要理解NX)

#include <stdio.h> //这是某道NX有关的题目
#include <string.h>
 void vul(char *msg)int main()
{
   puts("So plz give me your shellcode:");
   char buffer[256];
   memset(buffer,0,256);//初始化buffer
   read(0,buffer,256);//从输入中得到字符串载入buffer
   vul(buffer);//将buffer运行于NX
   return 0;
}

void vul(char *msg){
   char buffer[64]; 
   memcpy(buffer,msg,128);
   //Q2:将main函数的buffer的前128个字符复制到局部变量buffer中
   //但是局部变量buffer的长度只有64,这样做的意义是什么?
   //我猜测这是NX的关键,但是无法理解
   return;
}

2.IDA反编译

第零步:nc

(实话讲,该题我没有nc,先拖ida了,结果发现不需要nc,不然自己像个傻瓜)

第一步:拖入ida()

刚才已经知道此文件是64位,我们把它拖入ida64即可。

第二步:阅读main函数

按F5进行反编译。

main函数好像什么也没有,不过有一个func在最后运行。我们再看看func。
在这里插入图片描述

第三步:看看func

weget和weneed原本是v1和v2变量,为了方便我将其重命名了
大家可以看到第10行,当weneed == 11.28125,就会执行cat flag命令,拿到flag。
也就是说,我们只要让这个weneed存入11.28125,我们就可以做出来这道题了。

注意到gets函数从weget的地址开始(&为取址符号)读数据,gets是一个非常危险的函数因为他没有限制,你注入什么数据他就接收什么,我们就可以通过栈溢出使得weneed变为我们想要的了。
在这里插入图片描述

3.pwn!

第一步:注入多少数据?

我们点击weget和weneed查看其地址和空间大小。
在这里插入图片描述
在这里插入图片描述Q3:突然发现+00……08这个地址总是r且+00……0总是s,这里面有什么玄机吗?

由上图可以计算,我们需要注入(0x30 - 0x04)的数据,从而是我们可以给weneed赋值。
注入多少字节的数据就是看他的地址大小,如weget是从-00……030开始到-00……04结束,所以其差值就是我们需要注入的数据长度

不过最后赋值与前面的不太一样,前面注入数据是字节流,我们需要将weneed赋值的是浮点数,所以我一开始尝试b’11.28125’是不可以的。所以需要用到struct库的函数pack,将浮点型转化为字节流注入才行~

第二步:正式写exp

在这里插入图片描述

以上就是我们写好的exp脚本,接下来就是运行啦!

第三步:运行exp!

在这里插入图片描述

可以看到得到flag了,这题目就这样又解出来了。

0x03

谢谢大家阅读我的题解,有不足或疑问欢迎大家跟帖讨论~

最后

此题依旧是经典的栈溢出,难点个人感觉在于把float转为字节流,可以通过搜索解决。

之所以说难度加了但是没加,是因为此题的NX没有起到真正意义上的保护作用,不过还是促进我们去了解了一下这个东西。

问题小结

Q1仍为file命令对文件信息的观察,除了64位和elf其他还有什么用的疑问(好像问题不大?)

Q2是关于NX的代码理解,在上文c语言代码块引用中,非常希望有了解的同学跟帖~

Q3则是关于r和s几次出现在08和00地址的疑问

以上是问题小结,欢迎大家讨论!

后期补充

以下是与欧阳学长交流的关于以上问题的回答与参考,如NX这种暂时不明白的我会另开帖子以后再回头看
A1:“我一般就看下dynamic那里说明是动态链接,动态链接考虑libc泄漏,静态链接考虑利用gadget走系统调用”
A3:“ida里面看到的栈是ida调整过的左边地址全是偏移不是真实地址,真实地址gdb的时候能看到,(相对地址与绝对地址)”

A2参考:https://www.iteye.com/blog/totoxian-1220011
(此文前面部分cookie是canary保护,后文的NX没搞懂,canary倒是看懂了hh)
在此致谢欧阳学长

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值