B站滴水逆向,想学习逆向知识的一起学习吧!

评论区有热心网友提供了全部课件,真心非常感谢!

提取链接:https://pan.baidu.com/s/1YwUP9I7Vctqiq1sOW9feBA

提取码:p64y

需要课件还可以加QQ:0x83f99570

第一集(进制01)

列出0~100个二进制值(有机会列出1到16进制)

1进制

1 11 111 1111 11111 111111 1111111 11111111 111111111 1111111111
#由于太简单了,不宜列出,直接给出Python3源码吧:
x=1
while x<=101:i = '1' * xx+=1print(i)
print(len(str(i))) #最后一行字符个数

2进制

0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111 100000 100001 100010 100011 100100 100101 100110 100111 101000 101001 101010 101011 101100 101101 101110 101111 110000 110001 110010 110011 110100 110101 110110 110111 111000 111001 111010 111011 111100 111101 111110 111111 1000000 1000001 1000010 1000011 1000100 1000101 1000110 1000111 1001000 1001001 1001010 1001011 1001100 1001101 1001110 1001111 1010000 1010001 1010010 1010011 1010100 1010101 1010110 1010111 1011000 1011001 1011010 1011011 1011100 1011101 1011110 1011111 1100000 1100001 1100010 1100011 1100100

3进制

0 1 2 10 11 12 20 21 22 100 101 102 110 111 112 120 121 122 200 201 202 210 211 212 220 221 222 1000 1001 1002 1010 1011 1012 1020 1021 1022 1100 1101 1102 1110 1111 1112 1120 1121 1122 1200 1201 1202 1210 1211 1212 1220 1221 1222 2000 2001 2002 2010 2011 2012 2020 2021 2022 2100 2101 2102 2110 2111 2112 2120 2121 2122 2200 2201 2202 2210 2211 2212 2220 2221 2222 10000 10001 10002 10010 10011 10012 10020 10021 10022 10100 10101 10102 10110 10111 10112 10120 10121 10122 10200 10201

4进制

0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 100 101 102 103 110 111 112 113 120 121 122 123 130 131 132 133 200 201 202 203 210 211 212 213 220 221 222 223 230 231 232 233 300 301 302 303 310 311 312 313 320 321 322 323 330 331 332 333 1000 1001 1002 1003 1010 1011 1012 1013 1020 1021 1022 1023 1030 1031 1032 1033 1100 1101 1102 1103 1110 1111 1112 1113 1120 1121 1122 1123 1130 1131 1132 1133 1200 1201 1202 1203 1210

5进制

0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 40 41 42 43 44 100 101 102 103 104 110 111 112 113 114 120 121 122 123 124 130 131 132 133 134 140 141 142 143 144 200 201 202 203 204 210 211 212 213 214 220 221 222 223 224 230 231 232 233 234 240 241 242 243 244 300 301 302 303 304 310 311 312 313 314 320 321 322 323 324 330 331 332 333 334 340 341 342 343 344 400

6进制

0 1 2 3 4 5 10 11 12 13 14 15 20 21 22 23 24 25 30 31 32 33 34 35 40 41 42 43 44 45 50 51 52 53 54 55 100 101 102 103 104 105 110 111 112 113 114 115 120 121 122 123 124 125 130 131 132 133 134 135 140 141 142 143 144 145 150 151 152 153 154 155 200 201 202 203 204 205 210 211 212 213 214 215 220 221 222 223 224 225 230 231 232 233 234 235 240 241 242 243 244

7进制

0 1 2 3 4 5 6 10 11 12 13 14 15 16 20 21 22 23 24 25 26 30 31 32 33 34 35 36 40 41 42 43 44 45 46 50 51 52 53 54 55 56 60 61 62 63 64 65 66 100 101 102 103 104 105 106 110 111 112 113 114 115 116 120 121 122 123 124 125 126 130 131 132 133 134 135 136 140 141 142 143 144 145 146 150 151 152 153 154 155 156 160 161 162 163 164 165 166 200 201 202

8进制

0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37 40 41 42 43 44 45 46 47 50 51 52 53 54 55 56 57 60 61 62 63 64 65 66 67 70 71 72 73 74 75 76 77 100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 140 141 142 143 144

9进制

0 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 20 21 22 13 24 25 26 27 28 30 31 32 33 34 35 36 37 38 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 60 61 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 117 118 120 121 122 123 124 125 126 127 128 130 131 132 133 134 135 136 137 138 140 141

10进制

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #从小学到大的东西就不多写了

11进制

0 1 2 3 4 5 6 7 8 9 A 10 11 12 13 14 15 16 17 18 19 1A 20 21 22 23 24 25 26 27 28 29 2A 30 31 32 33 34 35 36 37 38 39 3A 40 41 42 43 44 45 46 47 48 49 4A 50 51 52 53 54 55 56 57 58 59 5A 60 61 62 63 64 65 66 67 68 69 6A 70 71 72 73 74 75 76 77 78 79 7A 80 81 82 83 84 85 86 87 88 89 8A 90 91 92 93 94 95 96 97 98 99 9A 100 101 102 103 104 105 106 107 108 109 10A 110

12进制

0 1 2 3 4 5 6 7 8 9 A B 10 11 12 13 14 15 16 17 18 19 1A 1B 20 21 22 23 24 25 26 27 28 29 2A 2B 30 31 32 33 34 35 36 37 38 39 3A 3B 40 41 42 43 44 45 46 47 48 49 4A 4B 50 51 52 53 54 55 56 57 58 59 5A 5B 60 61 62 63 64 65 66 67 68 69 7A 7B 80 81 82 83 84 85 86 87 88 89 8A 8B 90 91 92 93 94 95 96 97 98 99 9A 9B A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB 100 101 102 103 104 105 106 107 108 109 10A 10B 110

记住二进制与十六进制的映射(每日两遍)

  0   1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

练习:16转2进制(每日两遍)

487FDC120ACE69B953FE
0100 1000 0111 1111 1101 1100 0001 0010 0000 1010 1100 1110 0110 1001 1011 1001 0101 0011 1111 1110

练习:2转16进制(每日两遍)

1100 1011 0101 0100 1101 1110 1011 0101 0111 1011 0111 1010 1011 1000 0101 1100 1101 0010 0011 1001 1101
CB54DEB57B7AB85C239D

八进制

 0       1       2       3       4       5       6       7
10       11      12      13      14      15      16      17
20       21      22      23      24      25      26      27
30       31      32      33      34      35      36      37
40       41      42      43      44      45      46      47
50       51      52      53      54      55      56      57
60       61      62      63      64      65      66      67
70       71      72      73      74      75      76      77
100      101     102     103     104     105     106     107
110      111     112     113     114     115     116     117

八进制加法表

1+1=2
1+2=3  2+2=4
1+3=4  2+3=5  3+3=6
1+4=5  2+4=6  3+4=7  4+4=10
1+5=6  2+5=7  3+5=10 4+5=11 5+5=12
1+6=7  2+6=10 3+6=11 4+6=12 5+6=13 6+6=14
1+7=10 2+7=11 3+7=12 4+7=13 5+7=14 6+7=15 7+7=16

八进制乘法表

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=11
1*4=4  2*4=10 3*4=14 4*4=20
1*5=5  2*5=12 3*5=17 4*5=24 5*5=31
1*6=6  2*6=14 3*6=22 4*6=30 5*6=36 6*6=44
1*7=7  2*7=16 3*7=25 4*7=34 5*7=43 6*7=52 7*7=61

7进制加法表

1+1=2
1+2=3  2+2=4
1+3=4  2+3=5  3+3=6
1+4=5  2+4=6  3+4=10 4+4=11
1+5=6  2+5=10 3+5=11 4+5=12 5+5=13
1+6=10 2+6=11 3+6=12 4+6=13 5+6=14 6+6=15

7进制乘法表

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=12
1*4=4  2*4=11 3*4=15 4*4=22
1*5=5  2*5=13 3*5=21 4*5=26 5*5=34
1*6=6  2*6=15 3*6=24 4*6=33 5*6=42 6*6=51

7进制练习题

23456+54356=111145  5621-654=4636  234*65=2256623456              5623              234+54356                -654             * 65111145                 4636             1536210322566

16进制加法表

1+1=2
1+2=3  2+2=4
1+3=4  2+3=5  3+3=6
1+4=5  2+4=6  3+4=7  4+4=8
1+5=6  2+5=7  3+5=8  4+5=9  5+5=A
1+6=7  2+6=8  3+6=9  4+6=A  5+6=B  6+6=C
1+7=8  2+7=9  3+7=A  4+7=B  5+7=C  6+7=D  7+7=E
1+8=9  2+8=A  3+8=B  4+8=C  5+8=D  6+8=E  7+8=F  8+8=10
1+9=A  2+9=B  3+9=C  4+9=D  5+9=E  6+9=F  7+9=10 8+9=11 9+9=12
1+A=B  2+A=C  3+A=D  4+A=E  5+A=F  6+A=10 7+A=11 8+A=12 9+A=13 A+A=14
1+B=C  2+B=D  3+B=E  4+B=F  5+B=10 6+B=11 7+B=12 8+B=13 9+B=14 A+B=15 B+B=16
1+C=D  2+C=E  3+C=F  4+C=10 5+C=11 6+C=12 7+C=13 8+C=14 9+C=15 A+C=16 B+C=17 C+C=18
1+D=E  2+D=F  3+D=10 4+D=11 5+D=12 6+D=13 7+D=14 8+D=15 9+D=16 A+D=17 B+D=18 C+D=19 D+D=1A
1+E=F  2+E=10 3+E=11 4+E=12 5+E=13 6+E=14 7+E=15 8+E=16 9+E=17 A+E=18 B+E=19 C+E=1A D+E=1B E+E=1C
1+F=10 2+F=11 3+F=12 4+F=13 5+F=14 6+F=15 7+F=16 8+F=17 9+F=18 A+F=19 B+F=1A C+F=1B D+F=1C E+F=1D F+F=1E

16进制乘法表

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=C  4*4=10
1*5=5  2*5=A  3*5=F  4*5=14 5*5=19
1*6=6  2*6=C  3*6=12 4*6=18 5*6=1E 6*6=24
1*7=7  2*7=E  3*7=15 4*7=1C 5*7=23 6*7=2A 7*7=31
1*8=8  2*8=10 3*8=18 4*8=20 5*8=28 6*8=30 7*8=38 8*8=40
1*9=9  2*9=12 3*9=1B 4*9=24 5*9=2D 6*9=36 7*9=3F 8*9=48 9*9=51
1*A=A  2*A=14 3*A=1E 4*A=28 5*A=32 6*A=3C 7*A=46 8*A=50 9*A=5A A*A=64
1*B=B  2*B=16 3*B=21 4*B=2C 5*B=37 6*B=42 7*B=4D 8*B=58 9*B=63 A*B=6E B*B=79
1*C=C  2*C=18 3*C=24 4*C=30 5*C=3C 6*C=48 7*C=54 8*C=60 9*C=6C A*C=78 B*C=84 C*C=90
1*D=D  2*D=1A 3*D=27 4*D=34 5*D=41 6*D=4E 7*D=5B 8*D=68 9*D=75 A*D=82 B*D=8F C*D=9C D*D=A9
1*E=E  2*E=1C 3*E=2A 4*E=38 5*E=46 6*E=54 7*E=62 8*E=70 9*E=7E A*E=8C B*E=9A C*E=A8 D*E=B6 E*E=C4
1*F=F  2*F=1E 3*F=2D 4*F=3C 5*F=4B 6*F=5A 7*F=69 8*F=78 9*F=87 A*F=96 B*F=A5 C*F=B4 D*F=C3 E*F=D2 F*F=E1

16进制练习题

2D4E6+CF3A6=FC892    5FD1-E5A=5171    2CA*A5=1CC322D4E6              5FD1             2CA+CF3A6             -E5A             *A5FC88C               5177             DF21BE41CC32

第二集(进制02)

课堂练习

3进制定义:由3个符号组成,分别是:2、0、1,逢3进1

2 0 1 02 00 01 12 10 11 022 020 021 002 000 001 012 010 011 122 120 121 102 100 101 112 110 111 0222 0220 0221 0202 0200 0201 0212 0210 0211 0022 0020 0021 0002 0000 0001 0012 0010 0011 0122 0120 0121 0102 0100 0101 0112 0110 0111 1222 1220 1221 1202 1200 1201 1212 1210 1211 1022 1020 1021 1002 1000 1001 1012 1010 1011 1122 1120 1121 1102 1100 1101 1112 1110 1111

4进制定义:由4个符号组成,分别是:3、8、2、4,逢4进1

3 8 2 4 83 88 82 84 23 28 22 24 43 48 42 44 833 838 832 834 883 888 882 884 823 828 822 824 843 848 842 844 233 238 232 234 283 282 284 223 228 222 224 243 248 242 244 433 438 432 434 483 488 482 484 423 428 422 424 443 448 442 444 8333 8338 8332 8334 8383 8388 8382 8384 8323 8328 8322 8324 8343 8348 8342 8344 8833 8838 8832 8834 8883 8888

5进制定义:由5个符号组成,分别是:6、1、4、2、7,逢5进1

6 1 4 2 7 16 11 14 12 17 46 41 44 42 47 26 21 24 22 27 76 71 74 72 77 166 161 164 162 167 116 111 114 112 117 146 141 144 142 147 126 121 124 122 127 176 171 174 172 177 466 461 464 462 467 416 411 414 412 417 446 441 444 442 447 426 421 424 422 427 476 471 474 472 477 266 261 264 262 267 216 211 214 212 217 246 241 244 242 247 226 221 224 222 227 276 271 274 272 277 766 761 764 762 767 716 711 714 712 717 746 741 744 742 747 726 721 724 722 727 776 771 774 772 777

6进制定义:由6个符号组成,分别是:9、3、2、1、4、6

9 3 2 1 4 6 39 33 32 31 34 36 29 23 22 21 24 26 19 13 12 11 14 16 49 43 42 41 44 46 69 63 62 61 64 66 399 393 392 391 394 396 339 333 332 331 334 336 329 323 322 321 324 326 319 313 312 311 314 316 349 343 342 341 344 346 369 363 362 361 364 366 299 293 292 291 294 296 239 233 232 232 231 234 236 229 223 222

7进制定义:由7个符号组成,分别是:8、3、4、2、9、5、6,逢7进1

8 3 4 2 9 5 6 38 33 34 32 39 35 36 48 43 42 49 45 46 28 23 24 22 29 25 26 98 93 94 92 99 95 96 58 53 54 52 59 56 68 63 64 62 69 65 66 388 383 384 382 389 385 386 338 333 334 332 339 335 336 348 343 344 342 349 345 346 328 323 324 322 329 325 326 398 393 394 392 399 395 396 358 353 354 352 359 355 356 368 363 364 362 369 365 366 488 483 484 482 489 485 486 438 433 434 432 439 435 436 448 443 444

本节作业

1、9进制定义:有9个符号组成,分别是:2、9、1、7、6、5、4、8、3,逢9进1

2 9 1 7 6 5 4 8 3 92 99 91 97 96 95 94 98 93 12 19 11 17 16 15 14 18 13 72 79 71 77 76 75 74 78 73 62 69 61 67 66 65 64 68 63 52 59 51 57 56 55 54 58 53 42 49 41 47 46 45 44 48 43 82 89 81 87 86 85 84 83 32 39 31 37 36 35 34 38 33 922 929 921 927 926 925 924 928 923 992 999

加法表

9+9=1
9+1=7  1+1=6
9+7=6  1+7=5  7+7=4
9+6=5  1+6=4  7+6=8  6+6=3
9+5=4  1+5=8  7+5=3  6+5=92 5+5=99
9+4=8  1+4=3  7+4=92 6+4=99 5+4=91 4+4=97
9+8=3  1+8=92 7+8=99 6+8=91 5+8=97 4+8=96 8+8=95
9+3=92 1+3=99 7+3=91 6+3=97 5+3=96 4+3=95 8+3=94 3+3=98

计算

 123+234=694     123+234725

2、10进制定义:由10个符号组成,分别是:!、@、$、%、^、&、*、A、B、C,逢10进1

! @ $ % ^ & * A B C @! @@ @$ @% @^ @& @* @A @B @C $! $@ $$ $% $^ $& $* $A $B $C %! %@ %$ %% %^ %& %* %A %B %C ^! ^@ ^$ ^% ^^ ^& ^* ^A ^B ^C &! &@ &$ &% &^ && &* &A &B &C *!*@ *$ *% *^ *& ** *A *B *C A! A@ A$ A% A^ A& A* AA AB AC B! B@ B$ B% B^ B& B* BA BB BC C! C@ C$ C% C^ C& C* CA CB CC @!! @!@ @!$ @!% @!^ @!& @!* @!A @!B @!C @@! @@@

加法表

@+@=$
@+$=%  $+$=^
@+%=^  $+%=&  %+%=*
@+^=&  $+^=*  %+^=A  ^+^=B
@+&=*  $+&=A  %+&=B  ^+&=C  &+&=@!
@+*=A  $+*=B  %+*=C  ^+*=@! &+*=@@ *+*=@$
@+A=B  $+A=C  %+A=@! ^+A=@@ &+A=@$ *+A=@% A+A=@^
@+B=C  $+B=@! %+B=@@ ^+B=@$ &+B=@% *+B=@^ A+B=@& B+B=@*
@+C=@! $+C=@@ %+C=@$ ^+C=@% &+C=@^ *+C=@& A+C=@* B+C=@A C+C=@B

计算

   @$$B + %AC& =&!$%@$$B+%AC&&!$%

第三集(数据宽度_逻辑运算)

课堂练习

2+3=5    #用计算机的逻辑运算本质运算
X:0010   #将2存入容器X
Y:0011   #将-3存入容器Y0010xor 0011    #异或0001    R:0001  #将0001存入容器R0010& 00110010   #与运算后得出00010 <<1 == 0100   #左移一位是0100,不为0000所以继续X:0001   #将0001存入容器XY:0100   #将0100存入容器Y0001xor 0100   #异或0101   R:0101  将0101存入容器R0001& 01000000 <<1 == 0000  #左移一位还是0000,得出结果就是0101即 5

本节作业

1、八进制数2-5 在计算器中的结果是:1777777777777777777775 为什么?

转化成十六进制省略后为FD,表示的值为-3。

2、使用异或对 87AD6 进行加密后再进行解密,加解密秘钥:5

加密:10000111101011010110xor 0101010101010101010111010010111110000011    #加密后的值为D2F83
解密:11010010111110000011xor 0101010101010101010110000111101011010110    #解密后的值为87AD6

3、只用逻辑运算2-3=?(涉及内容:逻辑运算、移位、数据宽度)

2-3=-1   #用计算机的逻辑运算本质运算
X:0010   #将2存入容器X
Y:1101   #将-3存入容器Y0010xor 1101    #异或1111    #值为-10010& 11010000   #与运算后得出00000 <<1 == 0000   #左移一位还是0000,得出结果就是1111即 -1

额外内容

记住32位通用寄存器英文缩写就OK了

  寄存器   主要用途                              编号        存储的数据范围EAX     累加器                                0          0 - 0xFFFFFFFFECX     计数                                     1          0 - 0xFFFFFFFFEDX     I/O指针                              2          0 - 0xFFFFFFFFEBX     DS段的数据指针                           3          0 - 0xFFFFFFFFESP     堆栈指针                               4          0 - 0xFFFFFFFFEBP     SS段的数据指针                           5          0 - 0xFFFFFFFFESI     字符串操作的源指针;SS段的数据指针      6          0 - 0xFFFFFFFFEDI     字符串操作的目标指针;ES段的数据指针     7          0 - 0xFFFFFFFF

本节作业

下载DTDebug并练习

开头的课件里有哦大家自行下载吧。

1、使用DTDebug打开一个EXE程序(F3),并找到寄存器窗口。

2、使用DTDebug打开一个EXE程序(F3),单步执行程序(F8)。

3、记住这8个通用寄存器的名称,按照顺序。

4、使用DTDebug打开一个EXE程序(F3),使用MOV指令修改8个寄存器的值单步执行,观察修改后的结果。

第四集(通用寄存器_内存读写)

本节作业

题目课件里有,这里就不列出了

按老师留的一个个练习吧


第五集(内存地址_堆栈)

开头的寻址公式练习


本节练习

本来写完了切出浏览器去上网课了,回来后自动刷新啥也没了,坑啊,说好的自动保存,就算没保存也不至于自动刷新吧,泪目。。。
(本来可以更详细的)

1、使用EBX存储栈底地址,EDX存储栈顶地址,连续存储5个不同的数.

2、分别使用栈底加偏移、栈顶加偏移的方式读取这5个数,并存储到寄存器中.(第三问包括了,嘻嘻)
3、弹出这5个数,恢复栈顶到原来的位置.

4、使用2种方式实现:push ecx

5、使用2种方式实现:pop ecx

6、使用2种方式实现:push esp

7、使用2种方式实现:pop esp

第六集(标志寄存器)

课前彩蛋

破解一个简单的CRACKME.EXE

首先我们打开软件,软件里有一个登陆功能,如图:

我们随便输入后弹出一个框,显然是密码错误的意思:

通过听课知道了这是一个MessageBoxA弹窗,接着我们在od里面下断点:

运行程序登录并随意输入,停在此处后,在栈顶右击找到该位置


可以发现两个部分一部分是登录成功的弹窗,一部分是登陆失败的弹窗,我们继续在登录失败附近下断点,这样更接近判断密码是否正确的位置

接着在登陆程序一次,在od里找栈顶右击,找到对应位置


我们找到了关键信息,登录信息通过识别JE是否执行来跳转的,我们只需要在这个位置下断点,修改右边标志寄存器Z的值为1即可登陆成功!

课堂练习

标志寄存器


查看DTDEBUG中的EFLAGS的值,然后转换成二进制的形式,并取出CF/PF/AF/ZF/SF/OF的值
1、进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

2、奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中最低有效字节“1”的个数的奇偶性。

3、辅助进位标志AF(Auxiliary Carry Flag):
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。

4、零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。

5、符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

6、溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。(注意宽度的一半也不要与AF混淆)
最高位进位与溢出的区别:进位标志表示无符号数运算结果是否超出范围。.
溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:
(1)正 + 正 = 正 如果结果是负数,则说明有溢出
(2)负 + 负 = 负 如果结果是正数,则说明有溢出
(3)正 + 负 永远都不会有溢出.

1、无符号、有符号都不溢出

2、无符号溢出、有符号不溢出

3、无符号不溢出、有符号溢出

4、无符号、有符号都溢出
认真练习过后,很负责任地说确实不简单,试了多次才明白过来,理解的更加透彻了。

练习截图


ADC/SBB/XCHGMOVS/STOS/指令

adc指令:带进位加法(注意将进位标志寄存器值改为1。否则只是普通的加法)
进行普通加法后的值进一位,如:4进一位为5
格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样

SBB指令:带错位减法(注意将进位标志寄存器值改为1。否则只是普通的减法)
进行普通加法后的值减一位,如:4减一位为3
格式:SBB R/M,R/M 两边不能同时为内存 宽度要一样

XCHG指令:交换数据
将两边的数值进行等位交换
格式:XCHG R/M,R/M/IMM 两边不能同时为内存 宽度要一样

MOVS指令:移动数据 内存-内存
可以进行内存到内存的数据移动,一般将要移动的内存地址保存在ESI和EDI中,将ESI指向的内存地址复制到EDI指向的内存中
格式:BYTE/WORD/DWORD

练习截图

STOS指令:将Al/AX/EAX的值存储到[EDI]指定的内存单元

REP指令:按计数寄存器(ECX)中指定的次数重复执行字符串指令

课后作业


1、写汇编指令只影响CF位的值
实验了之后本来以为是只能最高位进位溢出,但是如果进位溢出AF肯定会跟着变化,所以只能借位溢出,sub eax,0xFFFFFFF1 等于sub eax,-0xF
截图标黄处为实验成果

2、写汇编指令只影响PF位的值
运算结果的二进制含有1的数量为奇数时PF位的值为1,偶数位PF位的值为0

3、写汇编指令只影响AF位值

4、写汇编指令只影响SF位的值

5、写汇编指令只影响OF位的值
这个OF位是真的奇怪啊,不试试真不知道问题在哪,得多加练习OF为才能理解不然他会影响CF和AF位,但是我依然有疑问,为什么AF位的介绍是低字节像高字节进位或借位,而我试验的al只要是结果为al中70到80之间的值时AF的值就会变为1大家可以实验实验,我是在这上面自闭了一小时也想不通。。。
看了第七集海哥的讲解明白了OF位值变化的原理,
首先看最高位是否进位,如果进位则为 1,否则为 0(借位也为0),然后判断最高有效位,也就是符号位的后一位,如 1100 中的第二位,如果进位则为 0 ,否则为 1,然后将两者异或,异或后的值即为OF位的值

后面3条都在前面做过了

第七集(JCC)

本节练习

JMP指令

JMP指令:修改EIP的值
只能影响EIP的值


CALL指令:
将下一个要执行的地址压倒ESP-4的栈中,然后跳转到指定位置


RET指令:
相当于把刚刚call储存在栈里面的值转移到EIP中并执行跳转,并且ESP中栈顶的值+4

比较指令

CMP指令:
指令格式:CMP R/M,R/M/IMM (不能两边都为内存和内存)
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。

可以发现CMP指令只进行比较,没有改变EAX和ECX的值

将CMP的截图和SUB的截图比较更直观


接着练习后三条指令

TEST指令:
指令格式:TEST R/M,R/M/IMM
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位.
与的操作表项如下:
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
TEST EAX,EAX (观察Z位)
但是如果EAX的二进制某些位为1的话,那么运算的结果就不为零。

JCC指令




练习截图


































第八集(堆栈图)

具体内容详见课堂,直接开始画堆栈图

图一








图二









图三












第九集(堆栈图2)

函数

(来自海哥课件)计算机的函数,是一个** 固定的 一个程序段**,或称其为一个 子程序 ,它在可以实验固定运算功能的同时还带有一入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理,所谓出口,就是指函数的计算结果,也称为返回值,在计算机求得之后,由此口带回给调用它的程序。

Windows堆栈

(来自海哥课件)
Windows堆栈的特点
1、先进后出
2、像低地址扩展
什么是堆栈平衡:
Windows中的堆栈,是一块普通的内存,主要用来存储一些临时的数据和参数等,可以把Windows中的堆栈想象成是一个公用的书箱,函数就像是使用箱子的人,函数在执行的时候,会用到这个书箱,把一些数据存到里面,但用完的时候一定要记得把书拿走,否则会乱的,也就是说,你放进去几本书,走的时候也要拿走几本书,这个就是堆栈平衡

函数嵌套堆栈图

修正下面的错误:
0019FEC4 改为 0019FF30

成型的堆栈图:




各步骤解读:















下面进入出栈的一步步演示



















第十集(C语言开篇)

练习










C源码:

#include "stdafx.h"int plus1(int x,int y)
{return x+y;
}int plus2(int x,int y,int z)
{int t,r;t = plus1(x,y);r = plus1(t,z);return r;
}int plus3(int x,int y,int z,int d,int g)
{int t,r;t = plus2(x,y,z);r = plus2(t,d,g);return r;
}int main(int argc, char* argv[])
{   plus3(1,2,3,4,5);return 0;
}





进制函数的编写(python3)


海哥说有基础的可以编写个进制函数,但是由于我只会python,就研究了几天写了两个python进制函数,第一个由于太简陋就不放出来了,直接给大家分享我写的进制函数2.0(符号版)

# 进制函数2.0(符号版
# 注意列表中不能有相同的字符
l1 = ['0', '1','2','3','¥','5','6','7','8','9']
def fn1(y,x=[]):if y==len(x)-1:y=-1while True:for i in range(y+1,len(x)):c1 = x[i]yield c1def fn(y,x=[]):data=[]s1=''w=0l2=str(x[0])l3=str(x[0])l4 =str(x[0])l5 =str(x[0])l6 = str(x[0])l7 = str(x[0])l8 = str(x[0])while True:for i in x:l0=iw+=1if w==y:d1=list(l0+l2+l3+l4+l5+l6+l7+l8)for i in d1:data.append(i)data.reverse()if y==1:s1=x[0]return s1for r in range(len(data)):if data[r]!=str(x[0]):for i in range(r, len(data)):s1 += data[i]breakreturn s1if l0==x[len(x)-1]:l2=next(fn1(x.index(l2),x))if l2 == x[0] and l0==x[len(x) - 1]:l3=next(fn1(x.index(l3),x))if l3 == x[0] and l0 == x[len(x) - 1]:l4 = next(fn1(x.index(l4), x))if l4 == x[0] and l0 == x[len(x) - 1]:l5 = next(fn1(x.index(l5), x))if l5 == x[0] and l0 == x[len(x) - 1]:l6 = next(fn1(x.index(l6), x))if l6 == x[0] and l0 == x[len(x) - 1]:l7 = next(fn1(x.index(l7), x))if l7 == x[0] and l0 == x[len(x) - 1]:l8 = next(fn1(x.index(l8), x))
print(fn(44444445,l1))

列表l1中储存的进制字符,fn()函数的参数1为进制表第几位的值,参数2为字符列表,海哥说这就是算是一个简单的加密了,苦思冥想几天写出来还是很有成就的。
最后也可以在结尾加上如下图变成傻瓜版进制函数:

第十一集(C语言02_数据类型)

本节学习


记录一下函数调用约定
常见的几种调用约定
1、前缀:__cdecl 参数压栈顺序:从右至左入栈 平衡堆栈:调用者清理栈(外平栈)
2、前缀:__stdcall 参数压栈顺序:从右至左入栈 平衡堆栈:自身清理栈(内平栈)
3、前缀:__fastcall 参数压栈顺序:ECX/EDX传送前两个,剩下:从右至左入栈 平衡堆栈:自身清理栈(内平栈)
如图:




第四种情况是对 __fastcall 的补充如果传入的参数大于两个,则余下的参数就按 __stdcall 的方式平衡堆栈

练习


凭借记忆还是写出来了,有三处细节没处理好,最后还是挺欣慰的

int __declspec(naked) plus(int x,int y,int z)
{__asm{ push ebpmov ebp,espsub esp,0x40mov ecx,0x10push ebxpush esipush edimov eax,0xccccccccLea edi,dword ptr ds:[ebp-0x40]rep stosdmov dword ptr ds:[ebp-4],0x4mov dword ptr ds:[ebp-8],0x3mov dword ptr ds:[ebp-0xc],0x2mov eax,dword ptr ds:[ebp+8]add eax,dword ptr ds:[ebp+0xC]add eax,dword ptr ds:[ebp-0xc]add eax,dword ptr ds:[ebp-0x8]add eax,dword ptr ds:[ebp-0x4]pop edipop esipop ebxmov esp,ebppop ebpret}
}

2、float类型的12.5转换成16进制


#include "stdafx.h"int __cdecl plus4(int x,int y)
{return x+y;
}
int __cdecl plus3(int x,int y)
{return x+y;
}
int __stdcall plus2(int x,int y,int z)
{return x+y+z;
}
int __fastcall plus1(int x,int y,int z,int v,int b)
{int u,i;u = plus2(x,y,z);i = plus3(x,y);return plus4(u,i);
}
int main(int argc, char* argv[])
{   plus1(1,3,4,6,7);return 0;
}

第十二集(C语言03_数据类型_IF语句)

全局变量的特点

1、在程序编译完以后就已经预留的空间,预留的大小由类型决定,且位置不会发生变化。
2、全局变量如果没有给的初始值,默认为0。
3、全局变量可以在任何其他的函数里面进行读写。
4、多个函数使用同一个全局变量,只要exe程序不结束,里面将一直存储最后一次修改的值。

练习

#include "stdafx.h"void Max()
{int g_x=5,g_y=4,g_z=7,g_r=0;if (g_x>g_y){if (g_x>g_z){g_r=g_x;}else {g_r=g_z;}}else {if (g_y>g_z){g_r=g_y;}else {g_r=g_z;}}printf("%d\n",g_r);
}
int main(int argc, char* argv[])
{   Max();return 0;
}

#include "stdafx.h"void ArrMax()
{int arr[4] = {2,5,7,9};int g_r;if (arr[0]>arr[1]){if (arr[0]>arr[2]){if (arr[0]>arr[3]){g_r=arr[0];}else{g_r=arr[3];}}else{if (arr[2]>arr[3]){g_r=arr[2];}else {g_r=arr[3];}}}else {if (arr[1]>arr[2]){if (arr[2]>arr[3]){g_r=arr[1];}else {g_r=arr[3];}}else {if (arr[2]>arr[3]){g_r=arr[2];}else {g_r=arr[3];}}}printf("%d\n",g_r);
}
int main(int argc, char* argv[])
{   ArrMax();return 0;
}

#include "stdafx.h"int arr[10] = {2,5,7,9,22,4,8,22,3,18};
int g_r;
int x;
void ArrMax()
{for (int i=0;i<=10;++i){if (arr[i]>arr[i-1]){g_r=arr[i];}else {x=arr[i];arr[i]=arr[i-1];arr[i-1]=x;g_r=arr[i];}}printf("%d\n",g_r);
}
int main(int argc, char* argv[])
{   ArrMax();return 0;
}

先挖个坑,等有指针基础了就补上

第十三集(C语言04_IF语句逆向分析)

全局变量、局部变量

全局变量的特点:
1、全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后面是否有值取决于声明时是否给定了初始值,如果没有,默认为0。
2、全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值。
3、全局变量所占内存会一直存在,直到整个进程结束。
4、全局变量的反汇编识别:
MOV 寄存器,byte/word/dword ptr ds:[0x12345678]
通过寄存器的宽度,或者byte/word/dword 来判断全局变量的宽度
全局变量就是所谓的基址
局部变量的特点:
1、局部变量在程序编译完成后并没有分配固定的地址。
2、在所属的方法没有被调用时,局部变量并不会分配内存地址,只有当所属的程序被调用了,才会在堆栈中分配内存。
3、当局部变量所属的方法执行完毕后,局部变量所占用的内存将变成垃圾数据。局部变量消失。
4、局部变量只能在方法内部使用,函数A无法使用函数B的局部变量。
5、局部变量的反汇编识别:
[ebp-4]
[ebp-8]
[ebp-0xC]
内存图:

2、函数参数的分析

如何判断函数有几个参数,已经分别是什么:
一般情况:
步骤一:观察调用处的代码

步骤二:找到平衡堆栈的代码继续论证

或者函数内部

最后,两者一综合,函数的参数个数基本确定
实际操作函数参数分析常见问题:
1、参数传递未必都是通过堆栈,还可能通过使用寄存器。
比如:

2、函数调用处的代码无法查看。

观察步骤:
1、不考虑ebp、esp
2、只找给别人赋值的寄存器
eax/ecx/edx/ebx/esi/edi
3、找到以后追查其来源,如果,该寄存器中的值不是在函数内存赋值的,那一定是传进来的参数。
公式一: 寄存器 + ret 4 = 参数个数
公式二: 寄存器 + [ebp+8] + [ebp+?] = 参数个数

4、IF…ELSE…语句逆向分析

课后练习:
1、




2、




#include "stdafx.h"int G;
void plus(int X,int Y)
{int r = G, t = 2;if (X>=Y){t+=1;}if (X<Y){G = t;}else{G = r+t;}
}
int main(int argc, char* argv[])
{   plus(1,2);return 0;
}

3、






#include "stdafx.h"int plus(int x,int y,int z)
{int t=0,e=1,r=2;if (x<=y){t = e-1;}else if(y>=z){t = r+1;}else if(x>z){t = e+r;}else{t = e+r-1;}return t+1;
}
int main(int argc, char* argv[])
{   printf("%d\n",plus(1,2,3));return 0;
}

第十四集(C语言05_正向基础)

基础知识

1、变量的声明,什么是赋值

总结:
声明变量就是告诉计算机,我要用一块内存,你给我留着,宽度和存储格式有数据类型决定。
计算机什么时候把这块内存给你,取决于变量的作用范围,如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有所在程序被调用的时候,才会分配空间。
全局变量如果不赋初始值,默认是0,但是局部变量在使用前一定要赋初始值。
2、类型转换
MOVSX 先符号扩展,再传送 (有符号扩展:如果为正数,即不超过数据宽度的一半,扩展后前面补零,如al:0x7f,扩展成cx后为:0x007f。如果为负数,即超过数据宽度的一半,扩展后前面补0xf,如al:0x80,扩展成cx后为:0xff80。可以理解为把数据宽度这个圆边长扩大了一倍)
如图:




MOVZX 先零扩展,再传送(无符号扩展:扩展后前面补零)
如图:


3、什么是表达式?表达式的结果.

特点一:
表达式无论多么复杂,都只有一个结果
特点二:
如果只有表达式,可以编译通过,但并不生成汇编代码,要与赋值或者其他流程控制语句一起组合的时候才有意义。
特点三:
当表达式中存在不同宽度的变量时,结果将转换为宽度最大的那个。

b站滴水逆向课后练习(入伍停更中)相关推荐

  1. 滴水逆向三期实践1:PE头字段解析,附PE结构下载

    视频资源详见网盘搜索 或 在线的B站滴水逆向三期 其课件也能在CSDN或百度搜索到,以下部分为课件内容摘要,部分为自己的理解 最后附上详细注释的自写代码 PE(Portable Executable) ...

  2. B站UP主发起停更潮

    我是卢松松,点点上面的头像,欢迎关注我哦! 近日用户发现很多B站自媒体表示,暂时停止更新,短期内不会再上传新的内容.停更原因方面,平台收益减少.收支难以平衡是停止更新的主要原因. 不过很快B站UP主回 ...

  3. 滴水逆向4月16日学习

    滴水逆向 进制 1>.进制的定义: 十进制的定义:由十个符号组成,分别是0,1,2,3,4,5,6,7,8,9,逢十进一. 八进制的定义:由八个符号组成,分别是0,1,2,3,4,5,6,7,逢 ...

  4. 滴水逆向win32学习笔记1

    滴水逆向win32学习笔记 一.字符编码 基本介绍 关于utf-16.utf-8和unicode的关系 BOM头 二.宽字符 基本介绍 常用函数 三.Win32 API中的宽字符 什么是win32 A ...

  5. 静态链接库,动态链接库【滴水逆向三期48笔记】

    在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...

  6. 【高大上の连载】TA神犇的日常[弃坑,停更]

    这是一本以日记为形式的文学作品,主要记载TA神犇的日常生活以及神犇语录. 我于2015-5-25决定开始创作.本作品采用不定期更新的形式,欢迎随时随地来收看直播,更加欢迎来orzTA神犇,如: --- ...

  7. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )

    文章目录 前言 一.在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader 1.创建 DexClassLoader 2.使用 DexClassL ...

  8. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )

    文章目录 一.使用 DexClassLoader 获取组件类失败报错 二.失败原因分析 一.使用 DexClassLoader 获取组件类失败报错 在上一篇博客 [Android 逆向]启动 DEX ...

  9. 关于Cloud各种组件的停更/升级/替换

    关于Cloud各种组件的停更/升级/替换 1.由停更引发的"升级惨案" 1.1.停更不停用 被动修复bugs 不再接受合并请求 不再发布新版本 1.2.明细条目 以前 now202 ...

最新文章

  1. 下载和安装Nginx之普通的HTTP和HTTPS服务器
  2. 【转】HTTP协议详解
  3. 【学术相关】如何避免博士延期毕业?
  4. JS面向对象的程序设计之继承-继承的实现-借用构造函数
  5. AOP切入同类调用方法不起作用,AopContext.currentProxy()帮你解决这个坑
  6. python爬虫多进程_Python爬虫技术--基础篇--多进程
  7. [leetcode ]429. N-ary Tree Level Order Traversale (easy)
  8. 计算两个日期相差的天数,Calendar用法
  9. python读行-Python如何一次读取N行
  10. mac 关闭 mysqld 进程(亲测可用)
  11. python身份证号掩盖出生日期的代码_Python实现第一、二代公民身份证号码有效性校验...
  12. html5制作网站谁的好处,HTML5网站对后期SEO工作有什么好处
  13. Docker 之 概念介绍
  14. python等比例压缩图片_Python批量按比例缩小图片脚本分享
  15. 华为经典面试题(敲黑板!!!)
  16. Win10系统电脑如何设置窗口绿色护眼色
  17. 阿里云服务器ECS到底是什么?
  18. 阿法狗之后的围棋世界
  19. matlab中的代数环问题及其消除方法,Matlab中的代数环问题及其消除方法.pdf
  20. 二级管/三极管门电路原理

热门文章

  1. 22-23学年计算机软件技术实习1——计算器
  2. 彻底清除s001_dg 插件
  3. 【课堂笔记】AE文字特效
  4. android日志框架
  5. 2019.9.3 远景智能后台开发一面
  6. 牛逼的人,都已经开始用文言文写代码了!
  7. c语言软件对电脑配置要求高吗,请问学软件工程需要高配置的电脑吗?
  8. 文献阅读:深度学习模型利用生物医学文本上下文关系进行命名实体识别
  9. Java之HashMap经典算法-红黑树(插入节点平衡调整,左旋转,右旋转)
  10. 写给一个不懂得珍惜的人