本文作者:萌新

前情提要:萌新带你开车上p站(一)

0x04flag 


看题目描述似乎是一个和脱壳相关的逆向题目

按照给出的地址先下载过来

file看看

是个可执行文件

执行之

emm什么都看不出来,又没有源码

那载入gdb吧

emmm,没有符号表,无法反汇编

哦,对了,根据题目的提示这是加了壳的,所以先脱壳

这是什么壳呢?

Strings看看

upx的

这里简单介绍下upx:

UPX是一个著名的压缩壳,主要功能是压缩PE文件(比如exe,dll等文件),有时候也可能被病毒用于免杀.壳upx是一种保护程序。一般是EXE文件的一种外保护措施,主要用途 :

1、让正规文件被保护起来,不容易被修改和破解。

2、使文件压缩变小。

3、保护杀毒软件安装程序,使之不受病毒侵害。

4、木马,病毒的保护外壳,使之难以为攻破

和很多壳比起来upx的手动脱壳也比较简单,但是本文主要学习pwn而不是脱壳,

如果有对upx手动脱壳有兴趣的话这里推荐一篇文章:https://blog.csdn.net/fawdlstty/article/details/8332227

我们这里直接自动脱壳就可以了

接下来再载入gdb

反汇编main后看到了一个地址

打印出来

这就是flag了

加壳与脱壳技术实践操作:http://www.hetianlab.com/cour.do?w=1&c=CCIDe9a2-7038-4d4f-951e-c5b068d31798

 

0x05passcode


看题目描述,编译时没有报error,那是不是会报warning呢

连上机器后先看看源码

从源码中可以看到

1.程序功能是先输入name,然后输入passcode1,passcode2,相当于输入一个用户名,两个密码

2,main中接连执行welcome,login,中间没有push,pop,二者ebp相同

3,login()中scanf接收输入的时候,passcode1,passcode2没有加上&取地址,又由于passcode1,passcode2没有被初始化,所以我们scanf输入数据时,数据被保存到哪儿是未知的,只是知道数据被保存到passcode1,passcode2的值指向的地址中去了。

考虑2和3,我们猜想是否可以通过控制name的内容进而控制passcode1,passcode2呢?毕竟name取100字节,三者的ebp又是相同的

不过具体是否可行,我们上gdb试试

图x

可以看到name地址为%ebp-0x70,passcode1地址为ebp-0x10,二者差0x70-0x10=96个字节。

Passcode2地址为%ebp-0xc,.name和passcode2从差0x70-0xc=100个字节,我们只能通过写name控制passcode1,但是不能控制passcode2

既然可以控制passcode1,那么思路就清楚了。

由源码逻辑可知,printf,scanf,fflush

我们控制passcode1的地址(name的最后4字节)为ffliush地址,在随后scanf(“%d”,passcode1)接收输入时我们输入system(“/bin/cat flag)的地址

这样当执行fflush时,将会执行system,从而读到flag

通过GOT表获取flush地址

在图x中可以看到调用system的地址为080485ea,不过在此之前还有传参的操作,所以实际上,地址应该为0x080485e3,十进制为134514147

从而构造出exp

总结一下,这里用到的技术叫做GOT覆写,就本题而言,是这样子的:

我们通过控制nane的最后四个字节,将passcode1的值改为fflush的地址,而在程序中,scanf后会调用fflush,而我们已经把system(“bin/cat

flag”)的地址写到fflush中,覆盖了fflush在GOT表中的内容,所以当scanf调用时,会直接执行system打印flag,绕过了后面比较passcode1,passcode2的逻辑。

0x06random


看描述,是和随机数有关系

由源码可知,当满足key与random异或得0xdeadbeef时才打印flag

而random的值由rand函数产生,key的值由我们输入

那么本题的关键就是找到random的值是多少

我们知道,rand函数产生的实际是伪随机数,所以我们可以写个程序,先由rand生成一个数,将其与0xdeadbeef相异或,得到的值就是我们输入的key

这是一种思路

或者我们也可以用gdb调试,在程序判断if条件是否成立的地方下断点,观察内存布局,也是可以得到random的值的

下了断点后输入2,然后命中

可以看到,2是我们的输入,而0x6b8b4567则是random

那么我们将该值与random异或即可得到输入的key

0x07leg 


看题目这题是和arm、汇编相关的

把源程序下过来看看

看到main中需要满足key1()+key2()+key3()=key才可打印出flag

key是我们需要输入的

key1()等表示的相关函数的返回值

那么本题就是要求出相关函数的返回值并相加

而c源码中这三个函数都是内联汇编的形式

还是直接用gdb看看吧

题目和我们说了这是arm

通常情况下,arm以r0寄存器存返回值,对应在x86中就是eax

这一点从汇编中也可以看出

那么在每个函数中r0的值是多少呢

一一看过来

先看key1

可以看到,pc->r3->r0,也就是说r0的值为pc寄存器的值

这里有个知识点

ARM属于RISC,精简指令及,分三段流水,取指、译码、执行

当mov r3,pc执行时,此时的pc为当前指令地址+0x8,及0x8cdc+0x8

再看key2

add r6,pc,#1的意思是r6=pc+1,由key1的知识知,r6=0x8cfc+8+1,该值最低位为1

为什么要强调最低位

因为后面一条指令bx r6

bx指令用于切换处理器状态模式,最低位为1时,切换到Thumb指令执行,为0时,解释为ARM指令执行

所以执行该指令后就切换到了thumb模式下

而thumb模式下pc值为当前指令地址+4

所以执行r3,pc时,r3的值为0x8d04+4

再执行adds,r3,#4后r3的值Wie0x8d04+4+4

执行mov r0,r3后,r0的值也同r3

再看看key3

执行红框中的两条指令后,r0的值等于lr的值

lr即r14,存放是函数返回地址

具体的值在main中可以看到,为0x8d80

综上,得key值为108400

欲知后续,请留意每日文章推送!

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

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

    本文作者:萌新 前情回顾: 萌新带你开车上p站(一) 萌新带你开车上p站(二) 萌新带你开车上P站(三) 回顾一下前篇,我们开始新的内容吧 0x12 登录后看源码 通读程序,逻辑是这样子的: 输入6个 ...

  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. 大数据萌新的Python学习之路(二)

    笔记内容: 一.模块 Python越来越被广大程序员使用,越来越火爆的原因是因为Python有非常丰富和强大标准库和第三方库,几乎可以实现你所想要实现的任何功能,并且都有相应的Python库支持,比如 ...

  8. 萌新笔记——Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))

    在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...

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

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

随机推荐

  1. json 的基础入门

    JSON是什么: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.在初始的项目开发中人们更倾向于使用xml来进行数据的传输,但当JSON出现后,开发者更倾 ...

  2. 数字逻辑与EDA设计

    目录 第一章 数字逻辑基础 1.1数制与码制★★★ 数制 码制 1.2基本及常用的逻辑运算★★ 1.2逻辑函数表示方法★★ 1.3逻辑函数的化简★★★ 1.4常用74HC系列门电路芯片★ 第二章 组合 ...

  3. Core + Vue 后台管理基础框架8——Swagger文档

    1.前言 作为前后端分离的项目,或者说但凡涉及到对外服务的后端,一个自描述,跟代码实时同步的文档是极其重要的.说到这儿,想起了几年前在XX速运,每天写完代码,还要给APP团队更新文档的惨痛经历.给人家 ...

  4. Linux & Shell 学习笔记【1/2】

    因为工作上的需要,花了些许时间去熟悉学习Linux和Shell,现在也花点事件在此记录一下以加强巩固学习的内容吧.学的不算深入,所以都是一些比较junior的内容. 在下一篇随笔会详述之前写的一个用于 ...

  5. CSS躬行记(1)——CSS基础拾遗

    一.box-decoration-break CSS3新增的box-decoration-break属性可指定行内非替换元素在跨行.跨列或跨页时的样式渲染,它包含两个值: (1)slice:默认值,盒 ...

  6. Redis 按正则获取keys

    首先,我被坑了很久由于不知道这个redis支持的正则只有3种 1. * 任意长度的任意字符 2. ? 任意单一字符 3. [xxx] 匹配方括号中的一个字符 2.从上面开来,keys的模糊匹配功能很方 ...

  7. 5L-链表导论心法

    链表是比数组稍微复杂一点的数据结构,也是两个非常重要与基本的数据结构.如果说数组是纪律严明排列整齐的「正规军」那么链表就是灵活多变的「地下党」. 关注公众号 MageByte,有你想要的精彩内容. 链 ...

  8. Pandas和Numpy的一些金融相关的操作(一)

    Pandas和Numpy的一些金融相关的操作 给定一个净值序列,求出最大回撤 # arr是一个净值的np.ndarray i = np.argmax( (np.maximum.acumulate(ar ...

  9. 【SQL SERVER】锁机制

    锁定是 SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制. 基本概念 利用SQL Server Profiler观察锁 死锁产生的原因及避免 总结 基本概念 数据库引 ...

  10. Soldier and Number Game CodeForces - 546D 素因子数打表(素数筛的改造)

    题意: 输入 a 和 b(a>b),求a! / b!的结果最多能被第二个士兵给的数字除多少次. 思路: a! / b!肯定能把b!约分掉,只留下b+1~a的数字相乘,所以我们求b+1 ~ a的所 ...