西工大网络空间安全学院计算机系统基础实验二(phase_2下——漫漫深夜过后的黎明!!!)

news/2024/12/14 13:02:35/

内存地址内存地址中的数注释指向这块内存的寄存器
0xffffd0e8函数phase_2的栈帧
0xffffd0e40xffffd0f4函数phase_2的栈帧
0xffffd0e00x5655b7b0函数phase_2的栈帧
0xffffd0dc0x565566ca函数read_six_numbers的返回地址,函数phase_2的栈帧
0xffffd0d80x5655af64旧%ebx的值
0xffffd0d4
0xffffd0d0
0xffffd0cc0xffffd108第<read_six_numbers+26>行 push %edx
0xffffd0c80xffffd104第<read_six_numbers+30>行 push %edx
0xffffd0c40xffffd100第<read_six_numbers+34>行 push %edx
0xffffd0c0

0xffffd0fc

第<read_six_numbers+38>行 push %edx
0xffffd0bc0xffffd0f8第<read_six_numbers+42>行 push %edx
0xffffd0b80xffffd0f4第<read_six_numbers+43>行 push %eax
0xffffd0b40x565583c10x565583c1是字符串'%d %d %d %d %d %d'的地址%esp

图1:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+50>行汇编代码之后各寄存器与栈帧的情况

是不是有点小激动了呀哈哈哈,耐住性子千万不要着急,一步一步慢慢来哦!

内存地址内存地址中的数注释指向这块内存的寄存器
0xffffd0e8函数phase_2的栈帧
0xffffd0e40xffffd0f4函数phase_2的栈帧
0xffffd0e00x5655b7b0函数read_six_numbers的第一个入口参数,函数phase_2的栈帧
0xffffd0dc0x565566ca函数read_six_numbers的返回地址,函数phase_2的栈帧
0xffffd0d80x5655af64旧%ebx的值
0xffffd0d4
0xffffd0d0
0xffffd0cc0xffffd108第<read_six_numbers+26>行 push %edx
0xffffd0c80xffffd104第<read_six_numbers+30>行 push %edx
0xffffd0c40xffffd100第<read_six_numbers+34>行 push %edx
0xffffd0c0

0xffffd0fc

第<read_six_numbers+38>行 push %edx
0xffffd0bc0xffffd0f8第<read_six_numbers+42>行 push %edx
0xffffd0b80xffffd0f4第<read_six_numbers+43>行 push %eax
0xffffd0b40x565583c10x565583c1是字符串'%d %d %d %d %d %d'的地址
0xffffd0b00x5655b7b00x5655b7b0是你输入的针对'phase_2'的字符串的地址%esp

图2:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+51>行汇编代码之后各寄存器与栈帧的情况

内存地址内存地址中的数注释指向这块内存的寄存器
0xffffd0e8函数phase_2的栈帧
0xffffd0e40xffffd0f4函数phase_2的栈帧
0xffffd0e00x5655b7b0函数read_six_numbers的第一个入口参数,函数phase_2的栈帧
0xffffd0dc0x565566ca函数read_six_numbers的返回地址,函数phase_2的栈帧
0xffffd0d80x5655af64旧%ebx的值
0xffffd0d4
0xffffd0d0
0xffffd0cc0xffffd1080x6
0xffffd0c80xffffd1040x5
0xffffd0c40xffffd1000x4
0xffffd0c0

0xffffd0fc

0x3
0xffffd0bc0xffffd0f80x2
0xffffd0b80xffffd0f40x1
0xffffd0b40x565583c10x565583c1是字符串'%d %d %d %d %d %d'的地址
0xffffd0b00x5655b7b00x5655b7b0是你输入的针对'phase_2'的字符串的地址%esp

图3:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+55>行汇编代码之后各寄存器与栈帧的情。这时是不是觉得<__isoc99_sscanf@plt>非常神奇!!!在这一步过后,我们的思路便豁然开朗了起来)

内存地址内存地址中的数注释指向这块内存的寄存器
0xffffd0e8函数phase_2的栈帧
0xffffd0e40xffffd0f4函数phase_2的栈帧
0xffffd0e00x5655b7b0函数read_six_numbers的第一个入口参数,函数phase_2的栈帧
0xffffd0dc0x565566ca函数read_six_numbers的返回地址,函数phase_2的栈帧
0xffffd0d80x5655af64旧%ebx的值
0xffffd0d4
0xffffd0d0%esp
0xffffd0cc0xffffd1080x6
0xffffd0c80xffffd1040x5
0xffffd0c40xffffd1000x4
0xffffd0c0

0xffffd0fc

0x3
0xffffd0bc0xffffd0f80x2
0xffffd0b80xffffd0f40x1
0xffffd0b40x565583c10x565583c1是字符串'%d %d %d %d %d %d'的地址
0xffffd0b00x5655b7b00x5655b7b0是你输入的针对'phase_2'的字符串的地址

图4:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+60>行汇编代码之后各寄存器与栈帧的情。

内存地址内存地址中的数注释指向这块内存的寄存器
0xffffd0e8函数phase_2的栈帧
0xffffd0e40xffffd0f4函数phase_2的栈帧
0xffffd0e00x5655b7b0函数read_six_numbers的第一个入口参数,函数phase_2的栈帧
0xffffd0dc0x565566ca函数read_six_numbers的返回地址,函数phase_2的栈帧
0xffffd0d80x5655af64旧%ebx的值
0xffffd0d4
0xffffd0d0%esp
0xffffd0cc0xffffd1080x6
0xffffd0c80xffffd1040x5
0xffffd0c40xffffd1000x4
0xffffd0c0

0xffffd0fc

0x3
0xffffd0bc0xffffd0f80x2
0xffffd0b80xffffd0f40x1
0xffffd0b40x565583c10x565583c1是字符串'%d %d %d %d %d %d'的地址
0xffffd0b00x5655b7b00x5655b7b0是你输入的针对'phase_2'的字符串的地址
寄存器名称寄存器中的值
%eax0x6

图5:实际运行与纸上分析——使用"ni"命令执行第<read_six_numbers+63>行汇编代码之后各寄存器与栈帧的情。因为此时我们的%eax寄存器中的值为0x6,大于0x5,所以不会跳转到<read_six_numbers+73>这个没有任何内容的空地址上,进而不会引爆炸弹。)

……………………

(图6:实际运行与纸上分析——使用"ni"命令执行第<phase_2+47>行汇编代码之后各寄存器与栈帧的情。接着,第<phase_2+50>行判断(%esp+4)和0的大小,如果不相等就会跳到第<phase_2+64>行,可是第<phase_2+64>行就是引爆炸弹,所以不能不相等,所以%esp+4应该是0,而我们输入的却是1,所以万万不能继续执行了)

按quit退出,接着再重复一遍,先输入phase_1的正确字符串,接着输入"0 1 2 3 4 5"作为我们假设的phase_2的答案,然后一路按"ni",一直到我们刚刚的那个地方,如 图7:又来到了同样的<phase_2+50>这个地方 所示。

图7:又来到了同样的<phase_2+50>这个地方。接着,第<phase_2+50>行判断(%esp+4)和0的大小,如果不相等就会跳到第<phase_2+64>行。但是我们此时的函数栈帧中(%esp+4)的值就是0,相等,不会跳到<phase_2+64>,所以我们输入的6个数中对了第1个数,是"0"。)

图8:实际运行与纸上分析——使用"ni"命令执行第<phase_2+55>行汇编代码之后各寄存器与栈帧的情况

接着使用同样的方法,我们分别得到了剩下的几个数为:"1 1 2 3 5",也就是说,这其实是一个以0,1开头的斐波那契数列,所以我们针对phase_2的答案字符串即为"0 1 1 2 3 5"。

I turned the moon into something I call a Death Star.
0 1 1 2 3 5


http://www.ppmy.cn/news/1266634.html

相关文章

友元c++

#include <iostream> #include <string> using namespace std; class Lovers//爱人关系,基类 { public: Lovers(string theName);// void kiss(Lovers *lover); void ask(Lovers *lover, string something); protected: string name; friend cla…

Python:核心知识点整理大全8-笔记

目录 ​编辑 4.5 元组 4.5.1 定义元组 dimensions.py 4.5.2 遍历元组中的所有值 4.5.3 修改元组变量 4.6 设置代码格式 4.6.1 格式设置指南 4.6.2 缩进 4.6.3 行长 4.6.4 空行 4.6.5 其他格式设置指南 4.7 小结 第5章 if语句 5.1 一个简单示例 cars.py 5.2 条…

计算机网络:应用层(一)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

算法通关村——计算器问题解析

计算器问题 问题描述 LeetCode227. 给你一个字符串表达式s&#xff0c;请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在[-231,231-1]的范围内。 注意&#xff1a;不允许使用任何将字符串作为数学表…

多线程(Thread)

一、实现多线程 多线程是为了同步完成多项任务&#xff0c;提高资源使用率提高系统使用率。 1、继承Thread类 void run()在线程开启后&#xff0c;此方法将被调用执行&#xff0c;run()封装了被线程执行的代码void start()启动线程&#xff0c;Java虚拟机会调用run方法()、即…

解决oracle.sql.TIMESTAMP序列化转换失败问题 及 J2EE13Compliant原理

目录 报错现象报错内容处理方法Oracle驱动源码总结 报错现象 oracle表中存在TIMESTAMP类型的列时&#xff0c;jdbc查出来做序列化时报错 报错内容 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframewo…

C语言--每日练习题--Day38

第一题 1. 下列代码的运行结果&#xff08;&#xff09; short i 65537; int j i 1; printf("i%d,j%d\n", i, j); A&#xff1a;i 65537&#xff0c;j 65538 B&#xff1a;i 1&#xff0c;j 2 C&#xff1a;i -1&#xff0c;j 0 D&#xff1a;i 1&#xff…

(新手必看)自定义数据传输通信协议+STM32代码详解

前言 本篇博客主要学习和了解一些单片机协议的格式&#xff0c;在对传输大数据或者要求准确性的时候&#xff0c;都需要通过协议来发送接收&#xff0c;下面通过了解协议的基本构成和代码来分析和实现协议的发送和接收。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联…