0x00

首先非常感谢大家阅读我的第一篇。本文章不仅仅是题解,一些细枝末节的小问题也欢迎大家一起解答。

小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~

N1nE是本人另外一个名字,目前主要学习pwn方向,此文章以及后续别的文章,如有不当欢迎补充与纠正。

0x01 题目来源

题目来自buuctf的pwn栏目第三题warmup_csaw_2016

一道栈溢出的基础题目。

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

0x02 题解

1.分析文件

第一步:file 文件名

当我们下载附件以后,在linux的命令行里输入如下命令,得知是64位且是elf可执行文件。

(Q1:其他信息尚不知有什么作用,欢迎补充)



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

第二步:checksec 文件名

我们继续使用checksec看看这个文件的保护情况。

Q2:check是检查的意思,那么这里的sec是什么呢?我猜测是security



可以看出来没有什么保护

2.IDA反编译

第零步:nc

我一般一开始会先nc一下靶机,看看运行是什么样子的才放入ida,或者同时进行。

Q3:这样的行为在实战或比赛中会有什么影响吗?

第一步:拖入ida()

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

第二步:阅读main函数

按F5进行反编译。

我们可以看到这里有一个gets函数,这是一个非常不安全的函数,他会不管三七二十一读取你输入的数据。

当然这对我们是有利的。本人做栈溢出的题目基础思路便是通过该函数,注入数据使指针指向返回地址的命令并输入返回地址,运行相应的命令使得我们获得权限或者flag。



我们刚才提到,注入数据使指针指向返回地址的命令并输入返回地址。现在可以注入数据完成操作了,那么我们要返回地址到哪里呢?我们继续查看代码。

其实此处main函数给了我们提示,或者nc过去也可以运行到输出“WOW:40060D!”这样一个字符串。我们现在去看看40060D有什么。

第三步:阅读关键函数



大概意思就是只要运行这里,就可以直接把flag给我们了,那我们就可以开始写exp(exploit,攻击脚本与方案)了。

3.pwn!

第一步:注入多少数据?

我们点击main函数中gets存放输入数据的变量v5,查看其地址和空间大小。



可见其空间大小为40字节,s到r问欧阳学长得知是存放rbp地址。r就是存返回地址并进行返回。其实我突然注意到文件内部也有提示。

v5大小为0x40,s到r有0x8,也就是我们需要注入(0x40 + 0x8)字节的数据,并在最后输入地址运行我们想要运行的函数。思路清晰,我们开始写exp吧!

第二步:正式写exp



Q4:p64有关的作用欢迎补充!我对此也是有点懵懵的,这里放一个网络上的解释:

“用p64()发送数据时,是发送的字节流,也就是比特流(二进制流)。本来是01这样表示的,但是ide为了方便观察, 就转换成了\xc1\x0f\x00\x00\x00\x00\x00\x00。发送时,也是按照字节来发,所以要用"%s"来读取”

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

第三步:运行exp!



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

0x03

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

最后的最后

Q5:在写题解最后一步的时候我尝试重新连接但是遇到如下问题



不太清楚是不是因为做过一遍所以不能再做,以上五个疑问欢迎大家讨论~

下午又做了一次又可以了hhh

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)

在此致谢欧阳学长

根据欧阳学长纠正,楼上A1改为“我一般就看下dynamic那里说明是动态链接,动态链接考虑libc泄漏,静态链接考虑利用gadget走系统调用

0x00

欢迎来到Sevn和N1nE的第三篇博客~~!

这是本人第一次学动态调试的题目,很激动!有关gdb的小教程的分享欢迎查看如下网址~

gdb调试鹅厂姐姐教程

老规矩~

小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~

0x01 题目来源

题目来自buuctf的pwn栏目第四题pwn1_sctf_2016

一道栈溢出的略微变了一下的题目,加了一点难度但如果不深究一下可能学不到什么新的东西,就是深究I怎么变成you的过程我粗略学习了动态调试,相信以后会用得更多。

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

0x02 题解

1.分析文件

第一步:file 文件名

老老规矩,当我们下载附件以后,在linux的命令行里输入如下命令,得知是64位且是elf可执行文件。

可以看出这次是32位的文件,待会就用32位的ida查看咯~

tip:嫌弃文件名长的话可以输入“pwn1”以后点击tab键,会实现代码补全

第二步:checksec 文件名

我们继续使用checksec看看这个文件的保护情况。

有NX,但是先不用怕,目前还不需要我们绕过这个保护什么的。

2.IDA反编译

第零步:nc

随便看看(?)这一步并不是必须先做的。

第一步:拖入ida()

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

第二步:阅读main函数

按F5进行反编译。

main函数好像什么也没有,不过有一个func在最后运行。我们再看看vuln(是不是有点熟悉的感觉)。

第三步:看看vuln

看看

家人们,根本看不懂这些是什么东西。

只能知道他会打印一个tell me something about yourself,然后通过fgets录入你输入的数据,但是查fgets的用法之后得知,这里他是从edata流中获取32个字符存入&s。

Q1:edata是什么流,这里怎么感觉实际上和标准流一样的输入欸?

注意到26行用了strcpy函数,把v0复制到了&s,所以这个s是关键!我们去看看s。



开始的相对偏移地址是-0000003C



存放返回地址的是在+00000004

也就是说我们需要注入(0x3c+0x04)转二进制是64长度的数据,并在最后注入我们需要返回的解题关键地址。

现在有两个问题,fgets限制了只能输入32,我们没有办法注入64长度的数据。

其次是我们还不知道解题关键地址在哪里。

我们先解决第二个问题。

第四步:看看哪个地址的函数可以获取权限或者flag

我们可以看到有个getflag函数非常可疑,进去后果然发现它会返回flag,那么记住一下他的地址(右下角)

第二个问题解决了,我们回头解决第一个也是最重要的问题。

第五步:动态调试

1.准备阶段:找到特殊函数设置断点

这道题教给我一个道理,就是你实在看不懂也搜不明白代码的时候,动态调试是一个好出路。



注意到几个关键函数,其中的replace非常引人注目,他会改变什么呢?我们看到15行和17行的Iyou,或许是把这两个替换?我们现在准备动态调试。



查看replace函数的地址,设置断点,待会运行他就会在这里停下。

查看strcpy的地址,设置第二个断点,待会就可以观察他们会做些什么啦~

2.正式开始调试

输入命令r或run运行,此处我们键入“III love renli~”

像程序写的那样,“III love renli~”被存入了相应的地址



输入n执行下一个代码,replace执行完毕,发现“III love renli~”变成了“youyouyou love renli~”,说明我们有办法解决只能输入32个字节数据的问题了,因为我们可以把“I”这个一个字节的变成三个字节的“you”!

我们输入continue或者c继续运行,看看这个数据对栈的影响。



我们发现在调用strcpy以后,刚才的字符串被存入了一个地址,按照反编译的c语言我们知道那就是&s!也就是说,我们可以通过把“I”变成“you”的方式,利用栈溢出来获得flag了。第一个问题到此圆满解决。

就是s的地址,也就是点进去之后的-0000003C

3.pwn!

第一步:注入多少数据?

这我们在2.的第三步就算过了,点此处跳转:计算注入的数据长度

第二步:正式写exp



I会变成you所以注入20个字节会变成60个,后面的“ilrl”四个字节,加起来刚好是64

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

第三步:运行exp!

于是得到flag~

0x03

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

问题小结

Q1:edata是什么流,这里怎么感觉实际上和标准流一样的输入欸?

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

收获小结

当遇到看不懂的代码的时候,动态调试是个好办法。

古早wp合集的更多相关文章

  1. id0-rsa WP合集

    忙里偷闲做做题wwwwwwwwwwwww Intro to Hashing Intro to PGP Hello PGP Hello OpenSSL Intro to RSA Caesar Hello ...

  2. 掘金 Android 文章精选合集

    掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...

  3. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  4. Timesten 日常管理命令合集

    Timesten 日常管理命令合集 以下所有操作都是基于TT  11 版,早前版本本人没用过,命令是否适用我不清楚啊! 各类服务管理 一.TT的启停  停服务:  1.停止复制与cache 进程:  ...

  5. SAP成都研究院2018年总共87篇技术文章合集

    2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...

  6. 2000G电脑大型单机游戏合集

    激活码 游戏名称(ctrl+F查找) 下载链接005875 艾迪芬奇的记忆 游戏下载链接http://pan.baidu.com/s/1t2PYRAj546_1AcOB-khJZg554158 暗影: ...

  7. 一、美国国家经济研究局NBER教育经济研究项目工作论文合集

    一.美国国家经济研究局NBER教育经济研究项目工作论文合集 (一)项目地址: American National Bureau of Economic Research - Economics of ...

  8. 小程序框架WePY 从入门到放弃踩坑合集

    小程序框架WePY 从入门到放弃踩坑合集 一点点介绍WePY 因为小程序的语法设计略迷, 所以x1 模块化起来并不方便, 所以x2 各厂就出了不少的框架用以方便小程序的开发, 腾讯看到别人家都出了框架 ...

  9. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  10. 【Android】开发中个人遇到和使用过的值得分享的资源合集

    Android-Classical-OpenSource Android开发中 个人遇到和使用过的值得分享的资源合集 Trinea的OpenProject 强烈推荐的Android 开源项目分类汇总, ...

随机推荐

  1. 2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢。 返回先手赢还是后手赢。

    2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢. 返回先手赢还是后手赢. ...

  2. 2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大GOMAXPROCS,会不会对性能有帮助?为什么?

    2021-03-05:go中,io密集型的应用,比如有很多文件io,磁盘io,网络io,调大GOMAXPROCS,会不会对性能有帮助?为什么? 福哥答案2021-03-05: 这是面试中被问到的.实力 ...

  3. 2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。

    2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 .返回能走出来的最长的递增链长度. 福大大 答案2021-05-06: 自然智慧即可. 动态规划.二维 ...

  4. npm安装报错

    npm ERR! request to https://registry.cnpmjs.org/element-ui failed, reason: Hostname/IP does not matc ...

  5. 8张图带你全面了解kafka的核心机制

    前言 kafka是目前企业中很常用的消息队列产品,可以用于削峰.解耦.异步通信.特别是在大数据领域中应用尤为广泛,主要得益于它的高吞吐量.低延迟,在我们公司的解决方案中也有用到.既然kafka在企业中 ...

  6. centos linux系统安装详解

    打开vmware,版本差异区别不大 选择创建新的虚拟机 选择典型,是默认选项不用改,点击下一步 选择稍后安装操作系统(默认选项不用改),点击下一步 选择linux,并且版本改为centos 64位,点 ...

  7. 渗透测试-struts2攻防环境搭建拿shell

    一.下载Jspstudy 打开目录D:\JspStudy\tomcat\webapps 二.打开struts2并进行拿shell 1.打开struts2 在浏览器中输入网址http://localho ...

  8. 客户线上反馈:从信息搜集到疑难 bug 排查全流程经验分享

    写在前面:本文是我在前端团队的第三次分享,应该很少会有开发者写客户反馈处理流程以及 bug 排查的心得技巧,全文比较长,写了一个多星期大概1W多字(也是我曾经2年工作的总结),如果你有耐心阅读,我相信 ...

  9. Go 开源库运行时依赖注入框架 Dependency injection

    Dependency injection 一个Go编程语言的运行依赖注入库.依赖注入是更广泛的控制反转技术的一种形式.它用于增加程序的模块化并使其具有可扩展性. 实例展示(High API): typ ...

  10. Go语言中的init函数: 特点、用途和注意事项

    1. 引言 在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次.它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备. 在这篇文章 ...