SSD6 exercise1 解题思路
解题思路:
由dummy=1,可以知道dummy的地址已经被确定,dummy的值也被确定。结合:
start= (int)(*(((char *) &dummy)));
stride = (int)(*(((char *) &dummy)+ 1));
观察提取函数extract_message1和extract_message2,知道start是开始破解的第一个字符 的位置,而stride是破解时跳跃字符的最大间隔。
运行到此处,如果dummy的值没有改变,则start和 stride都是固定值,start=1,stride=0,显然是不可能的。因为data的数据为:
再结合破译出来前几个字符为:From:
可以知道start=8或9,stride=2或3.所以可以知道dummy的值在运行到此处时已经被改变了。显然只有:
voidprocess_keys12 (int * key1, int * key2)
{
*((int *) (key1 + *key1)) = *key2;
}
该函数的调用导致了dummy值的改变,且dummy=key2。所以:(key1 + *key1)是dummy的地址,又由:
int dummy = 1;
int start, stride;
int key1, key2, key3, key4;
char * msg1, * msg2;
key3 = key4 = 0;
显然知道key1=3,这是因为这几个变量的地址是连续的。
接着来解决key2.又前面可以知道start=8或9,stride=2或3.在watch窗口中给start和stride依次赋值(8,2)、(8,3)、(9,2)、(9,3),观察提取出来的msg1,只有当start=9,sride=3的时候,msg1的前面几个字符为:From:
Dummy的地址为:0x0018ff44,所以地址0x0018ff44处的值为:09,地址0x0018ff45处的值为:03,地址0x0018ff46处的值为:00,地址0x0018ff47处的值为:00。
所以dummy的值为:dummy=0x00000309=777
接下来解决key3和key4.看一下面的代码段:
start = (int)(*(((char *) &dummy)));
stride = (int)(*(((char *) &dummy) +1));
if (key3 != 0 && key4 != 0)
{
process_keys34(&key3, &key4);
//执行该函数后,则跳过下一程序段
}
msg1 = extract_message1(start, stride);
if (*msg1 == '\0')
{
process_keys34(&key3, &key4);
msg2 = extract_message2(start, stride);
printf("%s\n", msg2);
}
由于start=9,stide=3,所以:msg1 = extract_message1(start, stride);没有执行,如果执行了则*msg1!=’\0’。进一步可以知道:
voidprocess_keys34 (int * key3, int * key4)
{
*(((int*)&key3) + *key3) += *key4;
}
该函数的调用,使该函数的返回地址改变了,所以:(((int *)&key3) +*key3)是该函数的返回地址,又由编译原理中的相关知识可以知道函数的返回地址和函数参数的地址是连续的,并且返回地址为参数地址小1。函数返回地址比key3小于1,所以key3=-1.
但是该函数的返回地址到底返回到哪里去了呢???
其实,这是很简单的。下面有第二次调用process_keys34,显然第一次调用process_keys34的返回地址就是第二次调用该函数的返回地址。不然的话,程序陷入了死循环,或者是msg2 =extract_message2(start, stride);跳过,这两种显然都是不可能的。
key4的值就是这两次调用process_keys34的返回地址的差值。运行到第一次调用process_keys34的地方,打开反汇编(disassembly)窗口:
所以:key4=0x004013BF-0x00491392=45
SSD6 exercise1 解题思路相关推荐
- 2020考研 管理类联考数学 【题型分析及解题思路】
第一章 整式分式 1.若一元n次多项式A被(或者是B的因式)一元1次多项式B整除,求解A中的几个系数a,b(解题思路:代入法,让因式值为0,也可以配合多元多项式基本公式将复杂的B变成简单的几个一次多项 ...
- 2014计算机三级网络技术,2014计算机三级网络技术综合题解题思路
2014计算机三级网络技术综合题解题思路,全部自码 第一小题 IP地址的计算公式 正常IP地址计算:已知IP地址:子网掩码: 地址类别:A类地址:1-126(00)B类地址:128-191(10) C ...
- 2020腾讯广告算法大赛:赛题理解与解题思路
写在前面 期待已久的2020腾讯广告算法大赛终于开始了,本届赛题"广告受众基础属性预估".本文将给出解题思路,以及最完备的竞赛资料,助力各位取得优异成绩!!! 报名链接:https ...
- 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路
这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...
- 剑指offer第二版答案详细版(带详细解题思路)
1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...
- 素数c语言程序解题思路,C语言上机实验题目解题思路.doc
上机实验题目解题思路 目录 第十三次实验:指针之一2 2453:步骤:2 2454:步骤:2 3575:步骤:方法同24543 3576:步骤:3 3580:步骤:3 3582:步骤:3 第十二次实验 ...
- java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...
算法解题思路: 细读算法要求 找到极限情况 找到临界情况,结果依赖 找到最终的结束求解点 编程实现:考虑算法的空间复杂度和时间复杂度 案例说明: 假设: 输入字符串为:s, 长度为:slen, s的第 ...
- leetcode206.反转链表 解题思路(简单)
难度: 简单 题目:给你单链表的头结点head,请你反转链表,并返回反转后的链表. 示例1: 示例2: 示例3: 题目类型:数据结构链表 解题方法:双指针迭代法 解题思路: 1.申请两个新指针,分别指 ...
- LeetCode 中等难度 92. 反转链表 II解题思路
92. 反转链表 II 题目:中等难度 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4-& ...
最新文章
- 2.4基于虚拟机的Linux内核编译
- ML之xgboost :xgboost.plot_importance()函数的解读
- P4781-[模板]拉格朗日插值
- 螃蟹学PHP设计模式之访问者模式
- git分支创建分支删除分支合并
- C语言:从入门到进阶笔记(完整版)
- Scrapy 爬取今日头条街拍图片
- SSD(Single Shot MultiBox Detector)不得不说的那些事
- Java分别使用zxing及qrcode-plugin生成各种样式二维码
- 51单片机实验之流水灯和交替闪烁
- python行业中性_单因子测试(上)——因子中性化
- python集合增加元素_python集合的新增元素方法整理
- 衡水二中2021清华北大高考成绩查询,衡水中学2020高考成绩多少人考上清华北大...
- flink消费kafka从指定时间消费offset的日志
- 洛谷算法题单:模拟与高精度例题(下)
- xshell 与 putty
- Echarts柱状图label优化历程
- “中科杯”全国软件设计大赛决赛实录
- 微星主板刷新BIOS指南
- 数据库连接池 ( 四 ) Druid 连接池
热门文章
- openwrt 家庭监控 (后续添加其他模块)笔记1
- Regsvr32和Regasm注册DLL COM组件
- android高德地图中心点,高德地图中心点以及自定义infowindow
- dell服务器系统密钥和coa,买戴尔1545的问一下,你们有没有coa标签
- 既生Mahout,何生Spark MLlib ?
- 使用虹软SDK实现离线人脸注册,人脸登录(H5-JS前端,java后台)
- win10任务栏透明_TrayS - 终极美化任务栏(透明、应用居中)
- ES6 JavaScript Promise的感性认知
- 搭建私有云cloudreve教程
- 无人机航测案例-湘南某县增减挂钩拆旧地块航拍任务