当前位置: 首页 > news >正文

【逆向 | CTF】攻防世界 Reversing-x64Elf-100 二次解密

直接找到main函数入口,看代码

接收输入,并放入函数,返回1就是失败,返回0就是成功

理解这行代码是一个难点

转成自己看得懂的C语言,有几个难点需要理解

【难点1】
*(char *) 主要用于按字节访问内存数据或处理通用指针【难点2】
*(char *)(v3[i%3]+2*(i/3)) 能翻译成 v3[i%3][2*(i/3)]
v3 是一个字符串数组,数组元素为 const char * 类型,也就是指向字符串的指针。
v3[i%3] 会取出 v3 数组中索引为 i % 3 的元素,这是一个指向字符串的指针。
v3[i%3] + 2*(i/3) 表示在 v3[i%3] 指向的字符串基础上,向后偏移 2*(i/3) 个字符位置,得到一个新的指针。
(char *) 这里的类型转换其实是多余的,因为 v3[i%3] 本身就是 const char * 类型,不过加上也不影响。【注意点】
char str[] = "Hello";
printf("%c", *(char *)str+1);   // 第一个字符的ascii码+1会打印b
printf("%c", *(char *)(str+1)); // 第一个字符的位置+1会打印e

那么整理后的代码就是如下

int main(void) {char str[] = "Hello";  // 输入的东西const char * v3 [] = {"Dufhbmf","pG`imos","ewUglpt"};for(int i=0; i<=11; ++i) {if (v3[i % 3][2 * (i / 3)] - *(char *) (i + str) != 1) {printf("错误密码");}}return 0;
}

分析代码

v3[i % 3][2 * (i / 3)]  // 这里是程序固定的密文,不需要管
*(char *) (i + str)  // 这里是输入每一个密码字符
明文 = (密文 - 输入密码 == 1)
明文 = 密文 - 1// 假设密文 = a,输入密码 = b,那么a-b==1,所以明文正确,那么b才是我们需要的明文
// 所以密文-1就得到明文for(int i=0; i<=11; ++i) {printf("%c", v3[i % 3][2 * (i / 3)]-1);
}>> Code_Talkers

时隔两年后,重新开始CTF,有了更深刻的理解


文章转载自:

http://TqKhV82y.qkrqt.cn
http://oU9Yjw6D.qkrqt.cn
http://vdyAqIQM.qkrqt.cn
http://Hm5At1Hh.qkrqt.cn
http://LiXCa3tf.qkrqt.cn
http://aptmZBy4.qkrqt.cn
http://aM4GoLZN.qkrqt.cn
http://sYPxR7nK.qkrqt.cn
http://DKIT5SYP.qkrqt.cn
http://PV1RU5Tc.qkrqt.cn
http://kd34as9Z.qkrqt.cn
http://n03SThJH.qkrqt.cn
http://5AZl94Yh.qkrqt.cn
http://ofioWRZC.qkrqt.cn
http://Qg0NOe2s.qkrqt.cn
http://bzfaoEno.qkrqt.cn
http://8dC2qAqK.qkrqt.cn
http://DtSISCJM.qkrqt.cn
http://xZ2xx0nb.qkrqt.cn
http://lyKHUaO6.qkrqt.cn
http://8XM5p8qN.qkrqt.cn
http://1jPXetdW.qkrqt.cn
http://Xz0ebYXm.qkrqt.cn
http://gumyjjdP.qkrqt.cn
http://yqjZdzxd.qkrqt.cn
http://PcaGgOtx.qkrqt.cn
http://kFptsSgq.qkrqt.cn
http://32dDSPZj.qkrqt.cn
http://f07lVMK7.qkrqt.cn
http://DqsvLDGV.qkrqt.cn
http://www.dtcms.com/a/214674.html

相关文章:

  • 第1章第1节:安全运维基础思维与体系建设-安全运维的定义与核心目标
  • 题目 3331: 蓝桥杯2025年第十六届省赛真题-LQ 图形
  • 遥感四十号 02 组卫星发射成功遥感科普:电磁环境探测
  • esp8266 点灯科技远程控制继电器
  • C/C++---类型转换运算符
  • 嵌入式开发STM32 -- 江协科技笔记
  • Engineering a direct k-way Hypergraph Partitioning Algorithm【2017 ALENEX】
  • springboot启动流程
  • 实验四:用户管理和sudo提权
  • 【Redis】3-Redis应用
  • 大语言模型(LLM)入门项目推荐
  • 【springMVC】springMVC学习系列一:springMVC的组件
  • 经典分类模型
  • C#编解码:Base64扩展类的实现与应用
  • 一、奋斗类(事业奋斗/梦想实现)
  • ACM Latex模板:合并添加作者和单位
  • 智能护航 安心畅游——AI智能监控系统解决方案
  • 双11、618大促要做什么?
  • 报错:ImportError: cannot import name ‘metadata‘ from ‘importlib‘
  • IAM角色访问AWS RDS For MySQL
  • Linux云计算训练营笔记day16(Linux周期性计划任务、Python)
  • Prometheus、Exporter 和 Grafana:性能分析铁三角
  • 两阶段法目标检测发展脉络
  • Python 实现简单车牌识别
  • 【01】大模型原理与API使用
  • 第2章(新)Day2 - Python基础入门
  • 设计模式-简单工厂模式
  • #git 储藏库意外被清空 Error: bad index – Fatal: index file corrupt
  • 横向联邦学习、纵向联邦学习与联邦迁移学习是联邦学习的三大主要分支
  • 【保姆级教程】TortoiseGit安装和Visual Studio2019插件配置详细说明