400电话网络推广商城网站网站权重怎么看

张小明 2026/3/2 21:44:29
400电话网络推广商城网站,网站权重怎么看,网站首页 栏目页 内容页,国外景观设计网站听同学说安全项目1有点烦#xff0c;但做了感觉挺简单。项目1本身是很有助于复习指针和理解栈的含义的。写下一份总结帮助自己顺一下思路。1. 前置知识#xff08;一些在mooc安全项目提示讲过#xff09;指针运算#xff1b;内存memory里变量和代码的按顺序存储#xff1b…听同学说安全项目1有点烦但做了感觉挺简单。项目1本身是很有助于复习指针和理解栈的含义的。写下一份总结帮助自己顺一下思路。1. 前置知识一些在mooc安全项目提示讲过指针运算内存memory里变量和代码的按顺序存储多字节数据在内存地址按小端序排列堆栈的用法函数调用的活动记录main函数的参数 int main(int argc, char* argv[])放一张图帮助理解栈帧2. message1key1和key2贴出全部源码#include stdio.h #include stdlib.h int prologue[] { 0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F, 0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69, 0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72, 0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72, 0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966, 0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F, 0x20206F74, 0x74786565, 0x65617276, 0x32727463, 0x594E2020, 0x206F776F, 0x79727574, 0x4563200A }; int data[] { 0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72, 0x466D203A, 0x65693A72, 0x43646E20, 0x6F54540A, 0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F, 0x594E2020, 0x206F776F, 0x79727574, 0x4563200A, 0x6F786F68, 0x6E696373, 0x6C206765, 0x796C656B, 0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966, 0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F, 0x20206F74, 0x74786565, 0x65617276, 0x32727463, 0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69, 0x21687467, 0x63002065, 0x6C6C7861, 0x78742078, 0x6578206F, 0x72747878, 0x78636178, 0x00783174 }; int epilogue[] { 0x594E2020, 0x206F776F, 0x79727574, 0x4563200A, 0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69, 0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F, 0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966, 0x20206F74, 0x74786565, 0x65617276, 0x32727463 }; char message[100];//默认初始值全为0 void usage_and_exit(char* program_name) { fprintf(stderr, USAGE: %s key1 key2 key3 key4\n, program_name); exit(1); } void process_keys12(int* key1, int* key2) { *((int*)(key1 *key1)) *key2; } void process_keys34(int* key3, int* key4) { *(((int*)key3) *key3) *key4; } char* extract_message1(int start, int stride) { int i, j, k; int done 0; for (i 0, j start 1; !done; j) { for (k 1; k stride; k, j, i) { if (*(((char*)data) j) \0) { done 1; break; } message[i] *(((char*)data) j); } } message[i] \0; return message; } char* extract_message2(int start, int stride) { int i, j; for (i 0, j start; *(((char*)data) j) ! \0; i, j stride) { message[i] *(((char*)data) j); } message[i] \0; return message; } int main(int argc, char* argv[]) { int dummy 1; int start, stride; int key1, key2, key3, key4; char* msg1, * msg2; key3 key4 0; if (argc 3) { usage_and_exit(argv[0]); } key1 strtol(argv[1], NULL, 0);//把key12做了一个strtol的转换字符到long init型 key2 strtol(argv[2], NULL, 0); if (argc 3) key3 strtol(argv[3], NULL, 0); if (argc 4) key4 strtol(argv[4], NULL, 0); process_keys12(key1, key2); 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); } else { printf(%s\n, msg1); } return 0; }题目解读解码16进制密文实验要求源文件的源码不能修改目标四个整数key由题目得解密后应该又From开头调试→窗口→内存→输入data 可以看到data部分在内存中经过小端排序再经过ascii编码转换可以得到一串字符似乎包含我们需要的From理清思路从提示中的值start和stride决定dummy审一下main函数部分发现当没有key3和key4时通过start和stride读取一段消息得到message1extract_message1函数处理char * extract_message1(int start, int stride) { int i, j, k; int done 0; for (i 0, j start 1; ! done; j) { for (k 1; k stride; k, j, i) { if (*(((char *) data) j) \0) { done 1; break; } message[i] *(((char *) data) j);//对 data 的起始地址按字节做偏移 } } message[i] \0; return message; }总结从start1开始读取每读stride-1跳过一个字字节再会看一开始data经过ascii编码的那段文字很轻易得到从第十个字节开始读每读两个字节跳一个所以start9stride3start (int)(*(((char *) dummy))); // 取 dummy 的第1个字节 stride (int)(*(((char *) dummy) 1)); // 取 dummy 的第2个字节 dummy→ dummy 的地址 (char *)dummy→ 指向 dummy第 1 个字节 (((char *)dummy)→取这个字节的值 (int)(...)→ 转成 int而start和stride是由dummy决定的虽然main函数一开始定义了dummy1所以其实是这一步对dummy函数进行了修改利用指针篡改数据((char *) data)把int型的data变成char型四个字节一个int变成四部分四个字符((char *) data) j:指针 n 地址 n × sizeof(指向的类型)查看key1和dummy的地址得到key1key1 (dummy - key1) / sizeof(int)-3key20x00000309前四位无所谓777调试→属性→配置属性→调试—写参数再运行就能得到正确的message13. message2key3和key4msg1 extract_message1(start, stride); if (*msg1 \0) { process_keys34(key3, key4); msg2 extract_message2(start, stride); printf(%s\n, msg2); } else { printf(%s\n, msg1); }要想得到message2而不是message1似乎只能让message1的第个字节是’0’不过这是错误的尝试。再查看提示提示我们从process_keys34函数内部进行控制除了刚才那里的if控制流调用了process_keys34在这里也使用了if (key3 ! 0 key4 ! 0) { process_keys34(key3, key4); }再观察一下process_keys34函数执行了什么操作有什么可以实现劫持控制流的地方void process_keys34(int* key3, int* key4) { *(((int*)key3) *key3) *key4; }左边解引用key3 这个指针变量在栈上的地址 当成 int* 来用再在在栈上按sizeof(int)为单位偏移key3 个 int通过地址去访问该地址处存放的“值”右边再key4使访问到的值的数值变化*key4是main里那个 key4 的值这里的起点是key3在process_keys34 自己栈帧的位置也只能在 process_keys34 的栈附近改思路用key3和key4控制流程篡改process_keys34 的返回地址计算出 extract_message2 函数的地址。 用 Key3 定位到返回地址在栈上的位置。 用 Key4 把返回地址修改成 extract_message2 的函数入口地址劫持程序改变执行流查看key3在函数栈上的位置在调试到进入process_keys34函数时看到0x000000d9416ffd10 这是 key3 的地址 。也就是 process_keys34 这个函数在自己的栈帧里存放参数 key3 的位置。0x000000d9416ffd44 这是 key3 指向的地址 。也就是 main 函数里那个变量 key3 的地址。需要关注的是前面那个0x000000d9416ffd10虽然这里对message2的处理函数其实是不同的但仁慈的题目实则不需要我们重新给stride和start而且这俩也已经被key1和2固定了for (i 0, j start; *(((char*)data) j) ! \0; i, j stride) { message[i] *(((char*)data) j); } //从 start 开始每隔 stride 个字节取一个字符寻找process_keys34 的返回地址和 extract_message2 函数的起始地址当 main 调用process_keys34时call process_keys34CPU 会把main 中 call 指令的下一条地址压入栈中,所以在main里查看返回地址call X 里有两个地址 X写在指令里的是“函数入口地址” 被压栈的是“call 指令下一条指令的地址”它不会写在指令里返回地址内容00007FF65C4C1D19但我们是要进到存放这个地址值的位置进行修改key3 (返回地址内容所在位置 - key3) / sizeof(int) 一定要分清楚栈地址和内容值啊给一个错误例子别去内存窗口输入地址值查找窗口输入返回地址内容对应的是代码…别弄混了正确的找返回地址方法在process_keys34的堆栈上找先找到key3在process_keys34函数堆栈的位置这里重新做了一遍所以反汇编里地址和key3地址都变了在栈附近找小端排序的返回地址值00007FF71C271A59找到返回地址的位置0x0000004B154FFA88而这个返回地址的内容值加上key4大小后变成成 extract_message2起始地址值的地址07FF71C271082这里因为是要得到extract_message2 的“起始地址的值”内容值所以直接用用07FF71C271082本身即可key3:0x88-0x90-0x080x088-8/4-20x07FF71C271082-0x07FF71C271A590x2941key3-2key441key12不变重复一开始写入key1和key2的步骤写入所有key得到最后的message2
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站没有关键词库网站公司建设都招聘那些职位

你是小阿巴,刚刚开发上线了自己的第一个网站。 前几天只有几个人访问,网站运行得稳稳当当。 你得意地想:做网站也太简单了吧! 结果一周后,某知名博主 “鱼蛋” 不小心推广了 你的网站,突然来了 1 万个用户…

张小明 2026/1/11 8:11:22 网站建设

网站被墙检测wordpress网站视频播放

如何通过多语言AI安全模型实现企业合规成本降低60% 【免费下载链接】Qwen3Guard-Gen-8B 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3Guard-Gen-8B 在全球化业务快速扩张的今天,企业面临的最大挑战之一是如何高效处理多语言内容的安全审核。一家…

张小明 2026/1/3 10:52:03 网站建设

通州建设局网站个人简介html代码简单

零售门店智能导购:Kotaemon实现促销信息主动推送 在一家连锁超市的冷饮区,一位顾客正站在冰柜前犹豫不决。他的手机突然弹出一条消息:“您好,当前蒙牛低温酸奶正在参与‘第二件半价’活动,您常买的原味款也在其中。”与…

张小明 2026/1/2 22:25:49 网站建设

从电子商务网站f型眼球轨迹分析其网站布局微营销推广方案

第一章:农业产量分析中的回归诊断概述 在农业产量建模中,线性回归被广泛用于探索气候、土壤条件、施肥量等因素对作物产量的影响。然而,模型的有效性依赖于若干关键假设的成立,包括线性关系、误差项的正态性、同方差性以及独立性。…

张小明 2026/1/5 0:14:21 网站建设

网站须知阜阳市建设工程网站

摘要 随着数字化时代的快速发展,影院行业对高效、便捷的购票管理系统的需求日益增长。传统的影院购票方式存在排队时间长、信息不透明、管理效率低等问题,亟需通过信息化手段提升用户体验和运营效率。企业级影院购票系统通过整合线上线下资源&#xff0c…

张小明 2026/1/2 10:00:51 网站建设

请简述企业网站建设的流程南通市城乡建设局网站

第一章:Dify 与 Spring AI 的版本兼容在集成 Dify 框架与 Spring AI 组件时,版本兼容性是确保系统稳定运行的关键因素。不同版本间的 API 变更、依赖冲突或序列化机制差异可能导致应用启动失败或运行时异常。为避免此类问题,开发者需严格比对…

张小明 2025/12/25 9:52:48 网站建设