BUUCTF--reverse2

测试文件:https://buuoj.cn/files/ef0881fc76e5bcd756b554874ef99bec/e8722e94-93d7-45d5-aa06-a7aa26ce01a1.rar?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoxNTJ9.XW-dPA.rxYLlTnLCwgbqaIazUXSdozVJvY

1.准备

获取信息

  1. 64位文件
  2. 可用IDA反编译C文件

2.IDA打开

打开main函数

左边在验证flag,右边很明显在对flag进行变换,进入flag变量我们能够看到

.data:0000000000601080                 public flag
.data:0000000000601080 ; char flag
.data:0000000000601080 flag            db '{'                  ; DATA XREF: main+34↑r
.data:0000000000601080                                         ; main+44↑r ...
.data:0000000000601081 aHackingForFun  db 'hacking_for_fun}',0
.data:0000000000601081 _data           ends
.data:0000000000601081

很明显了,就是对{hacking_for_fun}进行变换

2.1代码分析

将汇编代码反汇编为C代码

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   int result; // eax
 4   int stat_loc; // [rsp+4h] [rbp-3Ch]
 5   int i; // [rsp+8h] [rbp-38h]
 6   __pid_t pid; // [rsp+Ch] [rbp-34h]
 7   char s2; // [rsp+10h] [rbp-30h]
 8   unsigned __int64 v8; // [rsp+28h] [rbp-18h]
 9 
10   v8 = __readfsqword(0x28u);
11   pid = fork();
12   if ( pid )
13   {
14     argv = (const char **)&stat_loc;
15     waitpid(pid, &stat_loc, 0);
16   }
17   else
18   {
19     for ( i = 0; i <= strlen(&flag); ++i )
20     {
21       if ( *(&flag + i) == 'i' || *(&flag + i) == 'r' )
22         *(&flag + i) = '1';
23     }
24   }
25   printf("input the flag:", argv);
26   __isoc99_scanf("%20s", &s2);
27   if ( !strcmp(&flag, &s2) )
28     result = puts("this is the right flag!");
29   else
30     result = puts("wrong flag!");
31   return result;
32 }

在18~24行代码,我们很明显能够看到在遍历整个{hacking_for_fun},将'i'和‘r’字符替换为1

3.get flag!

flag{hack1ng_fo1_fun}

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11461132.html