攻防世界高手区刷题(更新ing)

forgot

打开题目checksec一下
在这里插入图片描述
是32位文件就放到32位的ida中反编译一下,看到经过一系列对v2数组的判断和v14的赋值,最后返回图中这一串指向的地址中的内容
在这里插入图片描述
刚好又发现了cat flag的字符串和system,所以这道题应该就是要覆盖掉这个地址,是它指向cat flag和system这个地址
在这里插入图片描述
在这里插入图片描述
再运行一下文件看看
在这里插入图片描述
发现有两个地方是可以输入的,看回到ida找到这两个地方很有可能就存在栈溢出漏洞,然后发现第一处的输入限制了输入32,并不能实现溢出,但是在第二输入时是没有限制长度的,所以这里就是栈溢出的点
在这里插入图片描述
在这里插入图片描述
v3和v2的距离也可以得到
在这里插入图片描述
现在就可以开始写payload的啦
payload1.0版本
在这里插入图片描述
运行了一下发现成功连接上了,但是flag并没有输出???所以又返回ida看看是什么原因,发现是因为前面本来以为没什么用的循环一直退出不了,所以才不能执行最后一步。这个循环是当v14=10的时候就会退出的,最开始给v14的初始值就是10,所以在循环中就不能让它有机会更改v14的值。查看各判断条件,
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述当输入给v2数组的溢出字符不满足这其中条件就不会更改v14的值,所以这里我选择了‘/’
payload2.0版
在这里插入图片描述
成功拿到flag
在这里插入图片描述

pwn100

checksec:
在这里插入图片描述
放进64位ida中反编译,看到有read函数和puts函数,但是没有\bin\sh和system
在这里插入图片描述
在这里插入图片描述
可以利用read函数进行栈溢出,可以看到可读入200个字符远大于0x40,从而可以泄露read的got表中的内容,把read的地址用puts函数打印出来,再把puts的返回地址设为main函数以此来再次利用栈溢出写入\bin\sh和system,因为是64位程序所以要先利用寄存器来传参,这里puts只有一个参数所以使用rdi就可以了
rdi的地址貌似一般都是在如图中pop的寄存器后而在retn前(貌似做过的题都是,还没找出什么原理,待挖掘…),但是也可以用命令行找一下edi的地址
在这里插入图片描述
在这里插入图片描述
得到rdi的地址为0x400763,然后就可以开始写payload的了,这里libc库的查找和system,/bin/sh的地址用wiki中推荐的LibcSea工具来辅助查找,这里贴上该工具的使用模板
在这里插入图片描述
在这里插入图片描述

pwn200

checkse一下
在这里插入图片描述
放进32位ida中反汇编,无system和\bin\sh,但发现write函数和read函数,其中read函数明显可以看到存在栈溢出,可以利用write来写入system和\bin\sh。
在这里插入图片描述在这里插入图片描述
由于动态绑定机制,所以我们需要两次调用函数,第二次调用时write函数就是绑定的got表的真实地址,可以进行写入,实现则利用read函数的栈溢出漏洞,修改返回地址为main函数地址,下面开始构造payload,system和\bin\sh的地址同样利用LibcSearcher来查找
在这里插入图片描述
在这里插入图片描述

dice_game

其实这道题特别像新手区里的guess_num,所以也可以用两种方法来实现,前提还是要了解c语言中rand和srand伪随机数生成函数的机制(http://c.biancheng.net/view/2043.html)

放进ida中看一下代码逻辑
在这里插入图片描述一眼看上去输入好像没有溢出点,继续往下看是要进行50次游戏,点开sub_A20()看看游戏的流程具体是什么
在这里插入图片描述看到这就觉得特别眼熟了,就是要每次都猜中随机数(1-6)是哪个,这时就想起之前新手区做的guess_num,又有rand和srand函数,所以两种方法

首先,两种方法都要把seed控制成想要的值,否则按照时间戳来设置seed的话就猜不中了。可以看到刚刚开始输入name的时候,是将我们输入的放入buf中,可以输入0x50个,而buf离seed的地址只有0x40,所以输入0x40个数就可以成功到达seed的地址,然后就是后续的操作了

方法一

写一个c语言程序来生成这50个随机数
在这里插入图片描述首先输入64个字符,我这里选的是0x30303030(0000),所以接着输入0000,然后将这50个数按顺序输入,得到flag
在这里插入图片描述在这里插入图片描述

方法二

ldd查询文件动态链接库,这道题其实题目的压缩包中也有直接给出是哪个动态链接库
在这里插入图片描述exp:
在这里插入图片描述在这里插入图片描述

Mary_Morton

ida看一下代码逻辑,发现题目给了三种选择,分别对应两个函数
在这里插入图片描述函数一(choice1):
在这里插入图片描述函数二(choice2):
在这里插入图片描述choice3:
结束程序
在这里插入图片描述可以看出函数一中read函数有栈溢出漏洞,而函数二有格式化字符串漏洞,其实选项中也有提示。并且这里很明显有个canary,这两个函数的结尾都有return一个异或的表达式,而看汇编语言也很明显可以看出函数结尾都有一个让rax与fs:28h进行异或的操作
在这里插入图片描述所以可以首先利用格式化字符串漏洞来得到canary的值,
在这里插入图片描述在这里插入图片描述可以看到buf的地址和v2的地址差了0x88而且还有6的偏移量,所以(0x88÷0x8)=0x11,0x11=17,17+6=23(64位8位为一个字节),知道了canary的值就可以利用choice1中的栈溢出漏洞来返回到system函数进行执行
exp:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值