培训 RE(略微提升)

培训 RE(略微提升)

1.热身

easyre

oWYFgg.png

2.reverse1

reverse1

shift+f12
oWYfG8.png

oWt5Y6.png
双击定位函数

oWYOiV.png
f5反编译

_int64 sub_1400118C0()
{
  char *v0; // rdi
  signed __int64 i; // rcx
  size_t v2; // rax
  size_t v3; // rax
  char v5; // [rsp+0h] [rbp-20h]
  int j; // [rsp+24h] [rbp+4h]
  char Str1; // [rsp+48h] [rbp+28h]
  unsigned __int64 v8; // [rsp+128h] [rbp+108h]

  v0 = &v5;
  for ( i = 82i64; i; --i )
  {
    *(_DWORD *)v0 = -858993460;
    v0 += 4;
  }
  for ( j = 0; ; ++j )                          // 遍历 str2 中的所有数据
  {
    v8 = j;
    v2 = j_strlen(Str2);
    if ( v8 > v2 )
      break;
    if ( Str2[j] == 111 )                       // 如果 str2 中的某一位的assic值等于 11 
      Str2[j] = 48;                             // 将 str2 中assic等于 11 的值assic更新为 48
  }
  sub_1400111D1((__int64)"input the flag:");
  sub_14001128F("%20s", &Str1);                 // 把输入的值存储在 str1 地址中
  v3 = j_strlen(Str2);                          // v3 等于 str2 的长度
  if ( !strncmp(&Str1, Str2, v3) )              // 把 &str1 和 str2 进行比较,最多比较前 v3 个字节
    sub_1400111D1((__int64)"this is the right flag!\n");
  else
    sub_1400111D1((__int64)"wrong flag\n");
  sub_14001113B(&v5, &unk_140019D00);
  return 0i64;
}

自输出的位置向上追踪

C 库函数 int strncmp(const char str1, const char str2, size_t n)str1str2 进行比较,最多比较前 n 个字节。

“!”是C语言中的非运算符,在变量前面使用它,会构建非运算表达式,表达式的返回结果是个布尔值(也就是只有true或false)

双击str2查看str2的值

oWaTpV.png

ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符
0 NUT 32 (space) 64 @ 96
1 SOH 33 65 A 97 a
2 STX 34 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 , 71 G 103 g
8 BS 40 ( 72 H 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DCI 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 TB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 \ 124
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 ~
31 US 63 ? 95 127 DEL

查assic可知111为o,48为数字0

所以flag为
flag{hell0_w0rld}

练习

reverse2

oWdJNn.png

for ( i = 0; i <= strlen(&flag); ++i )
    {
      if ( *(&flag + i) == 105 || *(&flag + i) == 114 )     // || 或
        *(&flag + i) = 49;   // 如果是 i 或者 r 替换为 数字1
    }
  }

flag{hack1ng_fo1_fun}

3.简单

超级简单

oWwZb4.png

oWwQ8x.png

4.脱壳

新年快乐

程序有upx壳

可以手动脱壳

oW0H6f.png
直接给了pop了

注意右下角只有esp是红的,使用esp定律

给第一个jmp打断点,f9运行

oWB1BD.png

选中右键脱壳调试进程

脱壳后保存即可

oWBU3t.png

代码逻辑很简单,不分析了

posted @ 2021-12-09 00:52  MuRKuo  阅读(66)  评论(0编辑  收藏  举报