培训 RE(略微提升)
培训 RE(略微提升)
1.热身
2.reverse1
shift+f12
_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) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
“!”是C语言中的非运算符,在变量前面使用它,会构建非运算表达式,表达式的返回结果是个布尔值(也就是只有true或false)
双击str2
查看str2的值
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}
练习
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.简单
4.脱壳
程序有upx壳
可以手动脱壳
注意右下角只有esp是红的,使用esp定律
给第一个jmp打断点,f9运行
选中右键脱壳调试进程
脱壳后保存即可
代码逻辑很简单,不分析了
A lion doesn't concern himself with the opinions of a sheep.