附件:https://files.buuoj.cn/files/7458c5c0ce999ac491df13cf7a7ed9f1/SimpleRev

题解

  • 查壳

64位ELF文件,无壳

  • IDApro处理,f5
  1. int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
  2. {
  3. int v3; // eax
  4. char v4; // [rsp+Fh] [rbp-1h]
  5. while ( 1 )
  6. {
  7. while ( 1 )
  8. {
  9. printf("Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: ");
  10. v4 = getchar();
  11. if ( v4 != 100 && v4 != 68 )
  12. break;
  13. Decry();
  14. }
  15. if ( v4 == 113 || v4 == 81 )
  16. Exit("Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: ", argv);
  17. puts("Input fault format!");
  18. v3 = getchar();
  19. putchar(v3);
  20. }
  21. }

分析代码,重点在Decry函数

  • 跟进去,进行分析
  1. unsigned __int64 Decry()
  2. {
  3. char v1; // [rsp+Fh] [rbp-51h]
  4. int v2; // [rsp+10h] [rbp-50h]
  5. int v3; // [rsp+14h] [rbp-4Ch]
  6. int i; // [rsp+18h] [rbp-48h]
  7. int v5; // [rsp+1Ch] [rbp-44h]
  8. char src[8]; // [rsp+20h] [rbp-40h] BYREF
  9. __int64 v7; // [rsp+28h] [rbp-38h]
  10. int v8; // [rsp+30h] [rbp-30h]
  11. __int64 v9[2]; // [rsp+40h] [rbp-20h] BYREF
  12. int v10; // [rsp+50h] [rbp-10h]
  13. unsigned __int64 v11; // [rsp+58h] [rbp-8h]
  14. v11 = __readfsqword('(');
  15. *(_QWORD *)src = 'SLCDN';
  16. v7 = 0LL;
  17. v8 = 0;
  18. v9[0] = 'wodah';
  19. v9[1] = 0LL;
  20. v10 = 0;
  21. text = join(key3, (const char *)v9); // text = "killshadow"
  22. strcpy(key, key1);
  23. strcat(key, src);
  24. v2 = 0;
  25. v3 = 0;
  26. getchar();
  27. v5 = strlen(key);//v5==>10
  28. for ( i = 0; i < v5; ++i )
  29. {
  30. if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
  31. key[i] = key[v3 % v5] + 32;
  32. ++v3;
  33. } //key = "ADSFKNDCLS" ==>"adsfkndcls"
  34. /*
  35. 将key中的大写字母转换为小写字母
  36. */
  37. printf("Please input your flag:");
  38. while ( 1 )
  39. {
  40. v1 = getchar();
  41. if ( v1 == 10 ) //0x0a 结束输入
  42. break;
  43. if ( v1 == 32 ) //0x20 v2加1
  44. {
  45. ++v2;
  46. }
  47. else
  48. {
  49. if ( v1 <= 96 || v1 > 122 )
  50. {
  51. if ( v1 > 64 && v1 <= 90 ) //大写
  52. {
  53. str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
  54. ++v3;
  55. }
  56. }
  57. else // (97,122] 小写字母
  58. {
  59. str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; //[65-90]
  60. ++v3;
  61. }
  62. //对str2中的字母最后转换为小写
  63. if ( !(v3 % v5) ) //判断str2的长度是否是key的整数倍,整数倍就输出空格
  64. putchar(32);
  65. ++v2; //v2统计输入的字符个数、指向下一个字符位置
  66. }
  67. }
  68. if ( !strcmp(text, str2) )
  69. puts("Congratulation!\n");
  70. else
  71. puts("Try again!\n");
  72. return __readfsqword(0x28u) ^ v11;
  73. }
  • 分析结果

    读取输入的字符串(以回车符结束)》对每个字母进行处理(v1 - 39 - key[v3 % v5] + 97) % 26 + 97》和"killshadow"进行比较

  • 逆向分析

    将整个流程反推即可

》payload

  1. lt='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  2. key=list('ADSFKNDCLS'.lower())
  3. klens=len(key)
  4. text='killshadow'
  5. flag=''
  6. for i in range(len(text)):
  7. str2=text[i]
  8. for c in lt:
  9. if str2== chr((ord(c) - 39 - ord(key[i % klens]) + 97) % 26 + 97):
  10. flag+=c
  11. print('flag{'+flag+'}')

小结

个人代码分析能力比较弱,分析程序意图的能力还有待提高

【Reverse】每日必逆0x01的更多相关文章

  1. 【Reverse】每日必逆0x03

    BUU-刮开有奖 附件:https://files.buuoj.cn/files/abe6e2152471e1e1cbd9e5c0cae95d29/8f80610b-8701-4c7f-ad60-63 ...

  2. 【Reverse】每日必逆0x02

    BUU SimpleRev 附件 https://files.buuoj.cn/files/7458c5c0ce999ac491df13cf7a7ed9f1/SimpleRev 题解 查壳 拖入iad ...

  3. 【Reverse】每日必逆0x00

    附件:https://files.buuoj.cn/files/aa4f6c7e8d5171d520b95420ee570e79/a9d22a0e-928d-4bb4-8525-e38c9481469 ...

  4. LeetCode——Reverse Integer(逆置一个整数)

    问题: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return –321   Ha ...

  5. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  6. [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)

    原题链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 题目描述: Evaluate the value of a ...

  7. 150. Evaluate Reverse Polish Notation逆波兰表达式

    [抄题]: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  8. 150 Evaluate Reverse Polish Notation 逆波兰表达式求值

    求在 逆波兰表示法 中算术表达式的值.有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达.例如:  ["2", "1&quo ...

  9. Evaluate Reverse Polish Notation(逆波兰式)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

随机推荐

  1. HTML js 页面倒计时后跳转至新页面

    HTML: 1 <body> 2 <p>操作错误!还有<span id="sp">5</span>秒跳转到交换机备份页面...< ...

  2. 记录自己的踩坑第一天 | CSS:vertical-align 属性

    前言 最近老师让大家单独写前后端分离项目,真是大家卷完后端,一起去卷前端了.(我以前都是主要负责后端,处于只大致看的懂的级别,说多了都是泪啊). 真是处于一边学一边写的状态,基本就是每天早上看上两~三 ...

  3. Cannot load module file xxx.iml的两种解决方法

    一. 一种是点击左上角File,然后点击Invalidate Caches / Restart...,弹出对话框再点击Invalidate and Restart等待工程重新加载,问题就解决了. 二. ...

  4. java中的lamda表达式

    List操作: 循环: list.forEach((p) -> System.out.printf("%s %s; %n", p.getFirstName(), p.getL ...

  5. HCNP Routing&Switching之BGP路由过滤和AS-Path-Filter

    前文我们聊了下通过修改BGP路由属性来影响路由,从而达到控制BGP路由的目的:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15495585.html:今天我们 ...

  6. 部署一个支持Dapr 的Kubernetes APISIX Ingress

    在这篇文章中,我将展示如何创建一个 APISIX控制器,该控制器在 Kubernetes 集群中公开启用 Dapr 的应用程序. 本质上,APISIX控制器将配置相同的标准 Dapr annotati ...

  7. jpg与jpeg的区别在哪

    JPG文件的优点是体积小巧,并且兼容性好,因为大部分的程序都能读取这种文件,这是因为JPG格式不仅是一个工业标准格式,而且更是web的标准文件格式.JPG文件如此拥有如此便利的条件,难怪得到了业余玩家 ...

  8. Spark SQL知识点大全与实战

    Spark SQL概述 1.什么是Spark SQL Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块. 与基本的Spark RDD API不同,Sp ...

  9. [atARC084D]Small Multiple

    构造一张图:$\forall x$,向$10x$连一条边权为0的边,向$x+1$连1条边权为1的边,那么0到$i$的代价即为$i$各位数字之和 考虑到我们只关心于当前点的两个特征:1.模$n$的余数( ...

  10. [loj3278]收获

    人的移动之间会相互影响,因此不妨看成果树逆时针移动,显然果树之间独立 考虑建图:1.每一棵果树向其逆时针旋转后第一个人连边:2.每一个人向其逆时针旋转不小于$C$的第一个人连边(即下一个摘的人),边权 ...