分析
题目给出了2个文件 – 程序AND中间指令
运行程序
出题人写了一个简单的汇编器,查看另一个附件,其中有着800行的中间代码
不是特别多,可以手动翻译一下,主要就是赋值和循环
1 2 3 4 5 6
| STRUCT exp : ARRAY .key(int)[24]<+0> ARRAY .L(int)[8]<+192> ARRAY .R(int)[8]<+256> ARRAY .X(int)[8]<+320>
|
main函数
1 2 3 4 5 6 7 8 9 10
| FUNCTION main - 1640 : ARRAY var11(char)[24]<+0> STRUCT var22(exp)<+488> STRUCT var23(exp)<+872> STRUCT var24(exp)<+1256> STRUCT var25(exp)<+1640> ARG var11<+24> temp1 := CALL read temp2 := #0 var15<+56> := temp2
|
第一个循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| LABEL label4 : temp4 := #24 IF var15<+56> < temp4 GOTO label3 GOTO label2 LABEL label3 : temp5 := #0 var12<+32> := temp5 var16<+64> := var15<+56> #!tempa := {#1}*{var16<+64>} var12<+32> ::= var11<+1><+tempa> temp6 := #23 temp7 := temp6 - var15<+56> var18<+80> := temp7 #!tempa := {#8}*{var18<+80>} var22(@exp.key[0])<+8><+488><+tempa> := var12<+32> temp3 := #1 var15<+56> := var15<+56> + temp3 GOTO label4 .......
|
转为C语言代码
1 2 3
| for (int i = 0; i < 24; i++) { var22.key[23 - i] = inputflag[i]; }
|
第二个循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| LABEL label2 : temp8 := #23 var15<+56> := temp8 LABEL label11 : temp10 := #0 IF var15<+56> > temp10 GOTO label10 GOTO label9 LABEL label10 : var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var19<+88> := var22(@exp.key[0])<+8><+488><+tempa> temp11 := #1 temp12 := var15<+56> - temp11 var16<+64> := temp12 #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.key[0])<+8><+488><+tempa> temp13 := var19<+88> - var17<+72> var21<+104> := temp13 #!tempa := {#8}*{var15<+56>} var22(@exp.key[0])<+8><+488><+tempa> := var21<+104> temp9 := #1 var15<+56> := var15<+56> - temp9 GOTO label11
|
转为C语言代码
1 2 3
| for (int i = 23; i > 0; i--) { var22.key[i] = var22.key[i] - var22.key[i - 1]; }
|
赋值区/初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| LABEL label9 : temp15 := #0 var22(@exp.L[0])<+200><+488> := temp15 temp17 := #8 var22(@exp.R[0])<+264><+488> := temp17 temp19 := #11 var22(@exp.X[0])<+328><+488> := temp19 temp21 := #15 var22(@exp.L[1])<+208><+488> := temp21 temp23 := #23 var22(@exp.R[1])<+272><+488> := temp23 temp25 := #0 temp26 := #13 temp27 := temp25 - temp26 var22(@exp.X[1])<+336><+488> := temp27 temp29 := #2 var22(@exp.L[2])<+216><+488> := temp29 temp31 := #11 var22(@exp.R[2])<+280><+488> := temp31 temp33 := #17 var22(@exp.X[2])<+344><+488> := temp33 temp35 := #10 var22(@exp.L[3])<+224><+488> := temp35 temp37 := #20 var22(@exp.R[3])<+288><+488> := temp37 temp39 := #0 temp40 := #19 temp41 := temp39 - temp40 var22(@exp.X[3])<+352><+488> := temp41 ......
|
以此类推,剩下的赋值与循环都是类似的
中间指令解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801
|
STRUCT exp : ARRAY .key(int)[24]<+0> ARRAY .L(int)[8]<+192> ARRAY .R(int)[8]<+256> ARRAY .X(int)[8]<+320>
FUNCTION read - 8 : PARAM var2<+8> LABEL Flabelread :
FUNCTION writes - 0 : LABEL Flabelwrites :
FUNCTION writef - 0 : LABEL Flabelwritef :
FUNCTION exit - 0 : LABEL Flabelexit :
FUNCTION main - 1640 : ARRAY var11(char)[24]<+0> STRUCT var22(exp)<+488> STRUCT var23(exp)<+872> STRUCT var24(exp)<+1256> STRUCT var25(exp)<+1640> ARG var11<+24> temp1 := CALL read temp2 := #0 var15<+56> := temp2
LABEL label4 : temp4 := #24 IF var15<+56> < temp4 GOTO label3 GOTO label2 LABEL label3 : temp5 := #0 var12<+32> := temp5 var16<+64> := var15<+56> #!tempa := {#1}*{var16<+64>} var12<+32> ::= var11<+1><+tempa> temp6 := #23 temp7 := temp6 - var15<+56> var18<+80> := temp7 #!tempa := {#8}*{var18<+80>} var22(@exp.key[0])<+8><+488><+tempa> := var12<+32> temp3 := #1 var15<+56> := var15<+56> + temp3 GOTO label4
LABEL label2 : temp8 := #23 var15<+56> := temp8 LABEL label11 : temp10 := #0 IF var15<+56> > temp10 GOTO label10 GOTO label9 LABEL label10 : var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var19<+88> := var22(@exp.key[0])<+8><+488><+tempa> temp11 := #1 temp12 := var15<+56> - temp11 var16<+64> := temp12 #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.key[0])<+8><+488><+tempa> temp13 := var19<+88> - var17<+72> var21<+104> := temp13 #!tempa := {#8}*{var15<+56>} var22(@exp.key[0])<+8><+488><+tempa> := var21<+104> temp9 := #1 var15<+56> := var15<+56> - temp9 GOTO label11
LABEL label9 : temp15 := #0 var22(@exp.L[0])<+200><+488> := temp15 temp17 := #8 var22(@exp.R[0])<+264><+488> := temp17 temp19 := #11 var22(@exp.X[0])<+328><+488> := temp19 temp21 := #15 var22(@exp.L[1])<+208><+488> := temp21 temp23 := #23 var22(@exp.R[1])<+272><+488> := temp23 temp25 := #0 temp26 := #13 temp27 := temp25 - temp26 var22(@exp.X[1])<+336><+488> := temp27 temp29 := #2 var22(@exp.L[2])<+216><+488> := temp29 temp31 := #11 var22(@exp.R[2])<+280><+488> := temp31 temp33 := #17 var22(@exp.X[2])<+344><+488> := temp33 temp35 := #10 var22(@exp.L[3])<+224><+488> := temp35 temp37 := #20 var22(@exp.R[3])<+288><+488> := temp37 temp39 := #0 temp40 := #19 temp41 := temp39 - temp40 var22(@exp.X[3])<+352><+488> := temp41 temp43 := #6 var22(@exp.L[4])<+232><+488> := temp43 temp45 := #13 var22(@exp.R[4])<+296><+488> := temp45 temp47 := #23 var22(@exp.X[4])<+360><+488> := temp47 temp49 := #9 var22(@exp.L[5])<+240><+488> := temp49 temp51 := #21 var22(@exp.R[5])<+304><+488> := temp51 temp53 := #0 temp54 := #29 temp55 := temp53 - temp54 var22(@exp.X[5])<+368><+488> := temp55 temp57 := #1 var22(@exp.L[6])<+248><+488> := temp57 temp59 := #19 var22(@exp.R[6])<+312><+488> := temp59 temp61 := #31 var22(@exp.X[6])<+376><+488> := temp61 temp63 := #4 var22(@exp.L[7])<+256><+488> := temp63 temp65 := #17 var22(@exp.R[7])<+320><+488> := temp65 temp67 := #0 temp68 := #37 temp69 := temp67 - temp68 var22(@exp.X[7])<+384><+488> := temp69
temp70 := #0 var15<+56> := temp70 LABEL label43 : temp72 := #8 IF var15<+56> < temp72 GOTO label42 GOTO label41 LABEL label42 : #!tempa := {#8}*{var15<+56>} var16<+64> := var22(@exp.L[0])<+200><+488><+tempa> #!tempa := {#8}*{var15<+56>} var18<+80> := var22(@exp.R[0])<+264><+488><+tempa> #!tempa := {#8}*{var15<+56>} var20<+96> := var22(@exp.X[0])<+328><+488><+tempa> #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.key[0])<+8><+488><+tempa> #!tempa := {#8}*{var18<+80>} var19<+88> := var22(@exp.key[0])<+8><+488><+tempa> var17<+72> := var17<+72> + var20<+96> var19<+88> := var19<+88> - var20<+96> #!tempa := {#8}*{var16<+64>} var22(@exp.key[0])<+8><+488><+tempa> := var17<+72> #!tempa := {#8}*{var18<+80>} var22(@exp.key[0])<+8><+488><+tempa> := var19<+88> temp71 := #1 var15<+56> := var15<+56> + temp71 GOTO label43
LABEL label41 : temp75 := #1 var15<+56> := temp75 LABEL label54 : temp77 := #24 IF var15<+56> < temp77 GOTO label53 GOTO label52 LABEL label53 : #!tempa := {#8}*{var15<+56>} var17<+72> := var22(@exp.key[0])<+8><+488><+tempa> temp78 := #1 temp79 := var15<+56> - temp78 var16<+64> := temp79 #!tempa := {#8}*{var16<+64>} var20<+96> := var22(@exp.key[0])<+8><+488><+tempa> var17<+72> := var17<+72> + var20<+96> #!tempa := {#8}*{var15<+56>} var22(@exp.key[0])<+8><+488><+tempa> := var17<+72> temp76 := #1 var15<+56> := var15<+56> + temp76 GOTO label54
LABEL label52 : temp81 := #0 var15<+56> := temp81 LABEL label61 : temp83 := #23 IF var15<+56> < temp83 GOTO label60 GOTO label59 LABEL label60 : var16<+64> := var15<+56> #!tempa := {#8}*{var16<+64>} var12<+32> := var22(@exp.key[0])<+8><+488><+tempa> temp84 := #1 temp85 := var15<+56> + temp84 var18<+80> := temp85 #!tempa := {#8}*{var18<+80>} var13<+40> := var22(@exp.key[0])<+8><+488><+tempa> temp86 := #0 var13<+40> := temp86 temp87 := var12<+32> ^ var13<+40> var14<+48> := temp87 #!tempa := {#8}*{var16<+64>} var22(@exp.key[0])<+8><+488><+tempa> := var14<+48> temp82 := #1 var15<+56> := var15<+56> + temp82 GOTO label61
LABEL label59 : temp89 := #0 var24(@exp.L[0])<+200><+1256> := temp89 temp91 := #12 var24(@exp.R[0])<+264><+1256> := temp91 temp93 := #0 temp94 := #19 temp95 := temp93 - temp94 var24(@exp.X[0])<+328><+1256> := temp95
temp97 := #9 var24(@exp.L[1])<+208><+1256> := temp97 temp99 := #10 var24(@exp.R[1])<+272><+1256> := temp99 temp101 := #0 temp102 := #10 temp103 := temp101 - temp102 var24(@exp.X[1])<+336><+1256> := temp103 temp105 := #9 var24(@exp.L[2])<+216><+1256> := temp105 temp107 := #12 var24(@exp.R[2])<+280><+1256> := temp107 temp109 := #3 var24(@exp.X[2])<+344><+1256> := temp109 temp111 := #8 var24(@exp.L[3])<+224><+1256> := temp111 temp113 := #19 var24(@exp.R[3])<+288><+1256> := temp113 temp115 := #0 temp116 := #11 temp117 := temp115 - temp116 var24(@exp.X[3])<+352><+1256> := temp117 temp119 := #10 var24(@exp.L[4])<+232><+1256> := temp119 temp121 := #12 var24(@exp.R[4])<+296><+1256> := temp121 temp123 := #0 temp124 := #9 temp125 := temp123 - temp124 var24(@exp.X[4])<+360><+1256> := temp125 temp127 := #9 var24(@exp.L[5])<+240><+1256> := temp127 temp129 := #13 var24(@exp.R[5])<+304><+1256> := temp129 temp131 := #3 var24(@exp.X[5])<+368><+1256> := temp131 temp133 := #1 var24(@exp.L[6])<+248><+1256> := temp133 temp135 := #22 var24(@exp.R[6])<+312><+1256> := temp135 temp137 := #0 temp138 := #19 temp139 := temp137 - temp138 var24(@exp.X[6])<+376><+1256> := temp139 temp141 := #0 var24(@exp.L[7])<+256><+1256> := temp141 temp143 := #23 var24(@exp.R[7])<+320><+1256> := temp143 temp145 := #7 var24(@exp.X[7])<+384><+1256> := temp145 temp147 := #12 var24(@exp.key[0])<+8><+1256> := temp147 temp149 := #31 var24(@exp.key[1])<+16><+1256> := temp149 temp151 := #31 var24(@exp.key[2])<+24><+1256> := temp151 temp153 := #31 var24(@exp.key[3])<+32><+1256> := temp153 temp155 := #31 var24(@exp.key[4])<+40><+1256> := temp155 temp157 := #31 var24(@exp.key[5])<+48><+1256> := temp157 temp159 := #31 var24(@exp.key[6])<+56><+1256> := temp159 temp161 := #31 var24(@exp.key[7])<+64><+1256> := temp161 temp163 := #42 var24(@exp.key[8])<+72><+1256> := temp163 temp165 := #46 var24(@exp.key[9])<+80><+1256> := temp165 temp167 := #45 var24(@exp.key[10])<+88><+1256> := temp167 temp169 := #45 var24(@exp.key[11])<+96><+1256> := temp169 temp171 := #20 var24(@exp.key[12])<+104><+1256> := temp171 temp173 := #23 var24(@exp.key[13])<+112><+1256> := temp173 temp175 := #23 var24(@exp.key[14])<+120><+1256> := temp175 temp177 := #23 var24(@exp.key[15])<+128><+1256> := temp177 temp179 := #23 var24(@exp.key[16])<+136><+1256> := temp179 temp181 := #23 var24(@exp.key[17])<+144><+1256> := temp181 temp183 := #23 var24(@exp.key[18])<+152><+1256> := temp183 temp185 := #12 var24(@exp.key[19])<+160><+1256> := temp185 temp187 := #12 var24(@exp.key[20])<+168><+1256> := temp187 temp189 := #12 var24(@exp.key[21])<+176><+1256> := temp189 temp191 := #0 temp192 := #7 temp193 := temp191 - temp192 var24(@exp.key[22])<+184><+1256> := temp193 temp195 := #0 var24(@exp.key[23])<+192><+1256> := temp195 temp196 := #23 var15<+56> := temp196
LABEL label118 : temp198 := #0 IF var15<+56> > temp198 GOTO label117 GOTO label116 LABEL label117 : var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var19<+88> := var24(@exp.key[0])<+8><+1256><+tempa> temp199 := #1 temp200 := var15<+56> - temp199 var16<+64> := temp200 #!tempa := {#8}*{var16<+64>} var17<+72> := var24(@exp.key[0])<+8><+1256><+tempa> temp201 := var19<+88> - var17<+72> var21<+104> := temp201 #!tempa := {#8}*{var15<+56>} var24(@exp.key[0])<+8><+1256><+tempa> := var21<+104> temp197 := #1 var15<+56> := var15<+56> - temp197 GOTO label118 LABEL label116 : temp202 := #0 var15<+56> := temp202 LABEL label126 : temp204 := #8 IF var15<+56> < temp204 GOTO label125 GOTO label124 LABEL label125 : #!tempa := {#8}*{var15<+56>} var16<+64> := var24(@exp.L[0])<+200><+1256><+tempa> #!tempa := {#8}*{var15<+56>} var18<+80> := var24(@exp.R[0])<+264><+1256><+tempa> #!tempa := {#8}*{var15<+56>} var20<+96> := var24(@exp.X[0])<+328><+1256><+tempa> #!tempa := {#8}*{var16<+64>} var17<+72> := var24(@exp.key[0])<+8><+1256><+tempa> #!tempa := {#8}*{var18<+80>} var19<+88> := var24(@exp.key[0])<+8><+1256><+tempa> var17<+72> := var17<+72> + var20<+96> var19<+88> := var19<+88> - var20<+96> #!tempa := {#8}*{var16<+64>} var24(@exp.key[0])<+8><+1256><+tempa> := var17<+72> #!tempa := {#8}*{var18<+80>} var24(@exp.key[0])<+8><+1256><+tempa> := var19<+88> temp203 := #1 var15<+56> := var15<+56> + temp203 GOTO label126 LABEL label124 : temp207 := #1 var15<+56> := temp207 LABEL label137 : temp209 := #24 IF var15<+56> < temp209 GOTO label136 GOTO label135 LABEL label136 : #!tempa := {#8}*{var15<+56>} var17<+72> := var24(@exp.key[0])<+8><+1256><+tempa> temp210 := #1 temp211 := var15<+56> - temp210 var16<+64> := temp211 #!tempa := {#8}*{var16<+64>} var20<+96> := var24(@exp.key[0])<+8><+1256><+tempa> var17<+72> := var17<+72> + var20<+96> #!tempa := {#8}*{var15<+56>} var24(@exp.key[0])<+8><+1256><+tempa> := var17<+72> temp208 := #1 var15<+56> := var15<+56> + temp208 GOTO label137 LABEL label135 : temp214 := #252 var23(@exp.key[0])<+8><+872> := temp214 temp216 := #352 var23(@exp.key[1])<+16><+872> := temp216 temp218 := #484 var23(@exp.key[2])<+24><+872> := temp218 temp220 := #470 var23(@exp.key[3])<+32><+872> := temp220 temp222 := #496 var23(@exp.key[4])<+40><+872> := temp222 temp224 := #487 var23(@exp.key[5])<+48><+872> := temp224 temp226 := #539 var23(@exp.key[6])<+56><+872> := temp226 temp228 := #585 var23(@exp.key[7])<+64><+872> := temp228 temp230 := #447 var23(@exp.key[8])<+72><+872> := temp230 temp232 := #474 var23(@exp.key[9])<+80><+872> := temp232 temp234 := #577 var23(@exp.key[10])<+88><+872> := temp234 temp236 := #454 var23(@exp.key[11])<+96><+872> := temp236 temp238 := #466 var23(@exp.key[12])<+104><+872> := temp238 temp240 := #345 var23(@exp.key[13])<+112><+872> := temp240 temp242 := #344 var23(@exp.key[14])<+120><+872> := temp242 temp244 := #486 var23(@exp.key[15])<+128><+872> := temp244 temp246 := #501 var23(@exp.key[16])<+136><+872> := temp246 temp248 := #423 var23(@exp.key[17])<+144><+872> := temp248 temp250 := #490 var23(@exp.key[18])<+152><+872> := temp250 temp252 := #375 var23(@exp.key[19])<+160><+872> := temp252 temp254 := #257 var23(@exp.key[20])<+168><+872> := temp254 temp256 := #203 var23(@exp.key[21])<+176><+872> := temp256 temp258 := #265 var23(@exp.key[22])<+184><+872> := temp258 temp260 := #125 var23(@exp.key[23])<+192><+872> := temp260 temp261 := #0 var15<+56> := temp261 LABEL label168 : temp263 := #24 IF var15<+56> < temp263 GOTO label167 GOTO label166 LABEL label167 : var16<+64> := var15<+56> #!tempa := {#8}*{var16<+64>} var17<+72> := var23(@exp.key[0])<+8><+872><+tempa> var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var19<+88> := var24(@exp.key[0])<+8><+1256><+tempa> temp264 := var17<+72> ^ var19<+88> var21<+104> := temp264 #!tempa := {#8}*{var15<+56>} var23(@exp.key[0])<+8><+872><+tempa> := var21<+104> temp262 := #1 var15<+56> := var15<+56> + temp262 GOTO label168 LABEL label166 : temp265 := #0 var15<+56> := temp265 LABEL label176 : temp267 := #8 IF var15<+56> < temp267 GOTO label175 GOTO label174 LABEL label175 : temp268 := var15<+56> + var15<+56> temp269 := temp268 + var15<+56> var16<+64> := temp269 #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.key[0])<+8><+488><+tempa> #!tempa := {#8}*{var15<+56>} var23(@exp.X[0])<+328><+872><+tempa> := var17<+72> temp266 := #1 var15<+56> := var15<+56> + temp266 GOTO label176 LABEL label174 : temp270 := #23 var15<+56> := temp270 LABEL label181 : temp272 := #0 IF var15<+56> > temp272 GOTO label180 GOTO label179 LABEL label180 : var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var19<+88> := var23(@exp.key[0])<+8><+872><+tempa> var16<+64> := var15<+56> temp273 := #1 var16<+64> := var16<+64> - temp273 #!tempa := {#8}*{var16<+64>} var17<+72> := var23(@exp.key[0])<+8><+872><+tempa> temp275 := var19<+88> - var17<+72> var21<+104> := temp275 #!tempa := {#8}*{var15<+56>} var23(@exp.key[0])<+8><+872><+tempa> := var21<+104> temp271 := #1 var15<+56> := var15<+56> - temp271 GOTO label181 LABEL label179 : temp276 := #0 var15<+56> := temp276 LABEL label190 : temp278 := #8 IF var15<+56> < temp278 GOTO label189 GOTO label188 LABEL label189 : #!tempa := {#8}*{var15<+56>} var16<+64> := var22(@exp.L[0])<+200><+488><+tempa> #!tempa := {#8}*{var15<+56>} var18<+80> := var22(@exp.R[0])<+264><+488><+tempa> #!tempa := {#8}*{var15<+56>} var20<+96> := var23(@exp.X[0])<+328><+872><+tempa> #!tempa := {#8}*{var16<+64>} var17<+72> := var23(@exp.key[0])<+8><+872><+tempa> #!tempa := {#8}*{var18<+80>} var19<+88> := var23(@exp.key[0])<+8><+872><+tempa> var17<+72> := var17<+72> - var20<+96> var19<+88> := var19<+88> + var20<+96> #!tempa := {#8}*{var16<+64>} var23(@exp.key[0])<+8><+872><+tempa> := var17<+72> #!tempa := {#8}*{var18<+80>} var23(@exp.key[0])<+8><+872><+tempa> := var19<+88> temp277 := #1 var15<+56> := var15<+56> + temp277 GOTO label190 LABEL label188 : temp281 := #1 var15<+56> := temp281 LABEL label201 : temp283 := #24 IF var15<+56> < temp283 GOTO label200 GOTO label199 LABEL label200 : #!tempa := {#8}*{var15<+56>} var17<+72> := var23(@exp.key[0])<+8><+872><+tempa> temp284 := #1 temp285 := var15<+56> - temp284 var16<+64> := temp285 #!tempa := {#8}*{var16<+64>} var20<+96> := var23(@exp.key[0])<+8><+872><+tempa> var17<+72> := var17<+72> + var20<+96> #!tempa := {#8}*{var15<+56>} var23(@exp.key[0])<+8><+872><+tempa> := var17<+72> temp282 := #1 var15<+56> := var15<+56> + temp282 GOTO label201 LABEL label199 : temp287 := #0 var15<+56> := temp287 LABEL label208 : temp289 := #7 IF var15<+56> < temp289 GOTO label207 GOTO label206 LABEL label207 : var16<+64> := var15<+56> #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.L[0])<+200><+488><+tempa> temp290 := #1 temp291 := var15<+56> + temp290 var18<+80> := temp291 #!tempa := {#8}*{var18<+80>} var19<+88> := var22(@exp.L[0])<+200><+488><+tempa> temp292 := var17<+72> ^ var19<+88> var21<+104> := temp292 temp293 := #23 IF var21<+104> > temp293 GOTO label215 GOTO label214 LABEL label215 : temp294 := #23 var21<+104> := temp294 LABEL label214 : #!tempa := {#8}*{var15<+56>} var25(@exp.L[0])<+200><+1640><+tempa> := var21<+104> temp288 := #1 var15<+56> := var15<+56> + temp288 GOTO label208 LABEL label206 : temp296 := #0 var25(@exp.L[7])<+256><+1640> := temp296 temp297 := #0 var15<+56> := temp297 LABEL label219 : temp299 := #7 IF var15<+56> < temp299 GOTO label218 GOTO label217 LABEL label218 : var16<+64> := var15<+56> #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.R[0])<+264><+488><+tempa> temp300 := #1 temp301 := var15<+56> + temp300 var18<+80> := temp301 #!tempa := {#8}*{var18<+80>} var19<+88> := var22(@exp.R[0])<+264><+488><+tempa> temp302 := var17<+72> ^ var19<+88> var21<+104> := temp302 temp303 := #23 IF var21<+104> > temp303 GOTO label226 GOTO label225 LABEL label226 : temp304 := #23 var21<+104> := temp304 LABEL label225 : #!tempa := {#8}*{var15<+56>} var25(@exp.R[0])<+264><+1640><+tempa> := var21<+104> temp298 := #1 var15<+56> := var15<+56> + temp298 GOTO label219 LABEL label217 : temp306 := #23 var25(@exp.R[7])<+320><+1640> := temp306 temp307 := #0 var15<+56> := temp307 LABEL label230 : temp309 := #7 IF var15<+56> < temp309 GOTO label229 GOTO label228 LABEL label229 : var16<+64> := var15<+56> #!tempa := {#8}*{var16<+64>} var17<+72> := var22(@exp.X[0])<+328><+488><+tempa> temp310 := #1 temp311 := var15<+56> + temp310 var18<+80> := temp311 #!tempa := {#8}*{var18<+80>} var19<+88> := var22(@exp.X[0])<+328><+488><+tempa> temp312 := var17<+72> ^ var19<+88> var21<+104> := temp312 #!tempa := {#8}*{var15<+56>} var25(@exp.X[0])<+328><+1640><+tempa> := var21<+104> temp308 := #1 var15<+56> := var15<+56> + temp308 GOTO label230 LABEL label228 : temp314 := #12 var25(@exp.X[7])<+384><+1640> := temp314 temp316 := #127 var25(@exp.key[0])<+8><+1640> := temp316 temp318 := #111 var25(@exp.key[1])<+16><+1640> := temp318 temp320 := #188 var25(@exp.key[2])<+24><+1640> := temp320 temp322 := #174 var25(@exp.key[3])<+32><+1640> := temp322 temp324 := #195 var25(@exp.key[4])<+40><+1640> := temp324 temp326 := #128 var25(@exp.key[5])<+48><+1640> := temp326 temp328 := #88 var25(@exp.key[6])<+56><+1640> := temp328 temp330 := #121 var25(@exp.key[7])<+64><+1640> := temp330 temp332 := #123 var25(@exp.key[8])<+72><+1640> := temp332 temp334 := #103 var25(@exp.key[9])<+80><+1640> := temp334 temp336 := #57 var25(@exp.key[10])<+88><+1640> := temp336 temp338 := #123 var25(@exp.key[11])<+96><+1640> := temp338 temp340 := #97 var25(@exp.key[12])<+104><+1640> := temp340 temp342 := #74 var25(@exp.key[13])<+112><+1640> := temp342 temp344 := #37 var25(@exp.key[14])<+120><+1640> := temp344 temp346 := #59 var25(@exp.key[15])<+128><+1640> := temp346 temp348 := #21 var25(@exp.key[16])<+136><+1640> := temp348 temp350 := #47 var25(@exp.key[17])<+144><+1640> := temp350 temp352 := #54 var25(@exp.key[18])<+152><+1640> := temp352 temp354 := #28 var25(@exp.key[19])<+160><+1640> := temp354 temp356 := #49 var25(@exp.key[20])<+168><+1640> := temp356 temp358 := #55 var25(@exp.key[21])<+176><+1640> := temp358 var25(@exp.key[22])<+184><+1640> := var1<+8> temp361 := #125 var25(@exp.key[23])<+192><+1640> := temp361 temp362 := #23 var15<+56> := temp362 LABEL label263 : temp364 := #0 IF var15<+56> > temp364 GOTO label262 GOTO label261 LABEL label262 : var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var19<+88> := var25(@exp.key[0])<+8><+1640><+tempa> var16<+64> := var15<+56> temp365 := #1 var16<+64> := var16<+64> - temp365 #!tempa := {#8}*{var16<+64>} var17<+72> := var25(@exp.key[0])<+8><+1640><+tempa> temp367 := var19<+88> - var17<+72> var21<+104> := temp367 #!tempa := {#8}*{var15<+56>} var25(@exp.key[0])<+8><+1640><+tempa> := var21<+104> temp363 := #1 var15<+56> := var15<+56> - temp363 GOTO label263 LABEL label261 : temp368 := #0 var15<+56> := temp368 LABEL label272 : temp370 := #8 IF var15<+56> < temp370 GOTO label271 GOTO label270 LABEL label271 : #!tempa := {#8}*{var15<+56>} var16<+64> := var25(@exp.L[0])<+200><+1640><+tempa> #!tempa := {#8}*{var15<+56>} var18<+80> := var25(@exp.R[0])<+264><+1640><+tempa> #!tempa := {#8}*{var15<+56>} var20<+96> := var25(@exp.X[0])<+328><+1640><+tempa> #!tempa := {#8}*{var16<+64>} var17<+72> := var25(@exp.key[0])<+8><+1640><+tempa> #!tempa := {#8}*{var18<+80>} var19<+88> := var25(@exp.key[0])<+8><+1640><+tempa> var17<+72> := var17<+72> - var20<+96> var19<+88> := var19<+88> + var20<+96> #!tempa := {#8}*{var16<+64>} var25(@exp.key[0])<+8><+1640><+tempa> := var17<+72> #!tempa := {#8}*{var18<+80>} var25(@exp.key[0])<+8><+1640><+tempa> := var19<+88> temp369 := #1 var15<+56> := var15<+56> + temp369 GOTO label272 LABEL label270 : temp373 := #1 var15<+56> := temp373 LABEL label283 : temp375 := #24 IF var15<+56> < temp375 GOTO label282 GOTO label281 LABEL label282 : #!tempa := {#8}*{var15<+56>} var17<+72> := var25(@exp.key[0])<+8><+1640><+tempa> temp376 := #1 temp377 := var15<+56> - temp376 var16<+64> := temp377 #!tempa := {#8}*{var16<+64>} var20<+96> := var25(@exp.key[0])<+8><+1640><+tempa> var17<+72> := var17<+72> + var20<+96> #!tempa := {#8}*{var15<+56>} var25(@exp.key[0])<+8><+1640><+tempa> := var17<+72> temp374 := #1 var15<+56> := var15<+56> + temp374 GOTO label283 LABEL label281 : temp379 := #0 var12<+32> := temp379 temp380 := #0 var13<+40> := temp380 temp381 := #0 var15<+56> := temp381 LABEL label292 : temp382 := #24 IF var15<+56> < temp382 GOTO label291 GOTO label290 LABEL label291 : var16<+64> := var15<+56> #!tempa := {#8}*{var15<+56>} var12<+32> := var22(@exp.key[0])<+8><+488><+tempa> var18<+80> := var15<+56> #!tempa := {#8}*{var18<+80>} var13<+40> := var23(@exp.key[0])<+8><+872><+tempa> IF var13<+40> != var12<+32> GOTO label298 GOTO label297 LABEL label298 : temp383 := CALL writef temp384 := CALL exit LABEL label297 : temp385 := #1 temp386 := var15<+56> + temp385 var15<+56> := temp386 GOTO label292 LABEL label290 : temp387 := CALL writes temp388 := CALL exit LABEL Flabelmain :
|
C代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
| #include <stdio.h> void read(int* var2) { Flabelread: }
void writes() { Flabelwrites: }
void writef() { Flabelwritef: }
void exit() { Flabelexit: }
typedef struct { int key[24]; int L[8]; int R[8]; int X[8]; } exp;
int main(char* var11[]) { exp var22; exp var23; exp var24; exp var25; char input[24]; scanf("%s",input);
for(int i=0;i<24;i++){ var22.key[23-i] = input[i]; }
for(int ie=23;ie>0;ie--){ var22.key[ie] = var22.key[ie]-var22.key[ie-1]; } var22.L[0] = 0; var22.R[0] = 8; var22.X[0] = 11; var22.L[1] = 15; var22.R[1] = 23; int tmp27 = 0 - 13;
var22.X[1] = tmp27; var22.L[2] = 2; var22.R[2] = 11; var22.X[2] = 17; var22.L[3] = 10; var22.R[3] = 20; for(int i =0;i<8;i++){ var22.key[var22.L[i]] += var22.X[i]; var22.key[var22.R[i]] -= var22.X[i]; }
for(int i=1;i<24;i++){ var22.key[i]+= var22.key[i-1]; }
for(int i=0;i<23;++){ var22.key[i]^=0; }
var24.L[0] = 0; var24.R[0] = 12;
for(int ie=23;ie>0;ie--){ var24.key[ie] -= var24.key[ie-1]; }
for(int i=0;i<8;i++){ var24.key[var24.L[i]] += var24.X[i]; var24.key[var24.R[i]] -= var24.X[i]; }
for(int i=1;i<24;i++){ var24.key[i] += var24.key[i-1]; }
for(int i=0;i<24;i++){ var23.key[i] ^= var24.key[i]; }
for(int i=0;i<8;i++){ var23.X[i] = var22.key[i*3]; }
for(int ie=23;ie>0;ie--){ var23.key[ie] -= var23.key[ie-1]; }
for(int i=0;i<8;i++){ var23.key[var22.L[i]] -= var23.X[i]; var23.key[var22.R[i]] += var23.X[i]; }
for(int i=1;i<24;i++){ var23.key[i] += var23.key[i-1]; }
for(int i=0;i<7;i++){ int tmp = var22.L[i]^var22.L[i+1]; if(tmp>23){ tmp = 23; } var22.L[i] = 23; }
var25.L[7] =0; for(int i=0;i<7;i++){ int tmp2 = var22.R[i]^var22.R[i+1]; if(tmp2>23){ tmp2 = 23; } var25.R[i] = tmp2; } var25.R[7] =23;
for(int i=0;i>7;i++){ var25.X[i] = var22.X[i+1]^var22.X[i]; }
for(int ie=23;ie>0;ie--){ var25.key[ie] -= var25.key[ie-1]; }
for(int i=0;i<8;i++){ var25.key[var25.L[i]] -= var25.X[i]; var25.key[var25.R[i]] += var25.X[i]; }
for(int i=1;i<24;i++){ var25.key[i] += var25.key[i-1]; }
for(int i=0;i<24;i++){ if(var22.key[i]!=var23.key[i]){ print("error"); break; } }
return 0; }
|
简单整理一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include <stdio.h> typedef struct { long long int key[24]; long long int L[8]; long long int R[8]; long long int X[8]; } exp; int main() { exp var22; exp var23; exp var24; exp var25; var22.L[0] = 0; var22.R[0] = 8; var22.X[0] = 11; var22.L[1] = 15; var22.R[1] = 23; var22.X[1] = -13; var22.L[2] = 2; var22.R[2] = 11; var22.X[2] = 17; var22.L[3] = 10; var22.R[3] = 20; var22.X[3] = -19; var22.L[4] = 6; var22.R[4] = 13; var22.X[4] = 23; var22.L[5] = 9; var22.R[5] = 21; var22.X[5] = -29; var22.L[6] = 1; var22.R[6] = 19; var22.X[6] = 31; var22.L[7] = 4; var22.R[7] = 17; var22.X[7] = -37; char input[24];
scanf_s("%s", input, sizeof(input));
for (int i = 0; i < 24; i++) { var22.key[23 - i] = input[i]; }
for (int ie = 23; ie > 0; ie--) { var22.key[ie] = var22.key[ie] - var22.key[ie - 1]; }
for (int i = 0; i < 8; i++) { var22.key[var22.L[i]] += var22.X[i]; var22.key[var22.R[i]] -= var22.X[i]; }
for (int i = 1; i < 24; i++) { var22.key[i] += var22.key[i - 1]; }
var23.key[0] = 252; var23.key[1] = 352; var23.key[2] = 484; var23.key[3] = 470; var23.key[4] = 496; var23.key[5] = 487; var23.key[6] = 539; var23.key[7] = 585; var23.key[8] = 447; var23.key[9] = 474; var23.key[10] = 577; var23.key[11] = 454; var23.key[12] = 466; var23.key[13] = 345; var23.key[14] = 344; var23.key[15] = 486; var23.key[16] = 501; var23.key[17] = 423; var23.key[18] = 490; var23.key[19] = 375; var23.key[20] = 257; var23.key[21] = 203; var23.key[22] = 265; var23.key[23] = 125;
for (int ie = 23; ie > 0; ie--) { var23.key[ie] -= var23.key[ie - 1]; }
for (int i = 0; i < 8; i++) { var23.key[var22.L[i]] -= var22.key[i * 3]; var23.key[var22.R[i]] += var22.key[i * 3]; }
for (int i = 1; i < 24; i++) { var23.key[i] += var23.key[i - 1]; }
for (int i = 0; i < 24; i++) { if (var22.key[i] != var23.key[i]) { break; } } return 0; }
|
z3约束解题
这儿使用z3约束一下,即可得解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| from z3 import *
s = Solver()
class exp: def __init__(self): self.key = [0] * 24 self.L = [0] * 8 self.R = [0] * 8 self.X = [0] * 8
var22 = exp()
var23 = exp()
key = [Int(('key[%d]' % i)) for i in range(24)] var22.key = key
for ie in range(23, 0, -1): var22.key[ie] = (var22.key[ie] - var22.key[ie - 1])
var22.L[0] = 0 var22.R[0] = 8 var22.X[0] = 11 var22.L[1] = 15 var22.R[1] = 23 var22.X[1] = -13 var22.L[2] = 2 var22.R[2] = 11 var22.X[2] = 17 var22.L[3] = 10 var22.R[3] = 20 var22.X[3] = -19 var22.L[4] = 6 var22.R[4] = 13 var22.X[4] = 23 var22.L[5] = 9 var22.R[5] = 21 var22.X[5] = -29 var22.L[6] = 1 var22.R[6] = 19 var22.X[6] = 31 var22.L[7] = 4 var22.R[7] = 17 var22.X[7] = -37
for i in range(8): var22.key[var22.L[i]] += var22.X[i] var22.key[var22.R[i]] -= var22.X[i]
for k in range(1, 24): var22.key[k] += var22.key[k - 1]
var23.key[0] = 252 var23.key[1] = 352 var23.key[2] = 484 var23.key[3] = 470 var23.key[4] = 496 var23.key[5] = 487 var23.key[6] = 539 var23.key[7] = 585 var23.key[8] = 447 var23.key[9] = 474 var23.key[10] = 577 var23.key[11] = 454 var23.key[12] = 466 var23.key[13] = 345 var23.key[14] = 344 var23.key[15] = 486 var23.key[16] = 501 var23.key[17] = 423 var23.key[18] = 490 var23.key[19] = 375 var23.key[20] = 257 var23.key[21] = 203 var23.key[22] = 265 var23.key[23] = 125
for m in range(23, 0, -1): var23.key[m] -= var23.key[m - 1]
for n in range(8): var23.key[var22.L[n]] -= var22.key[n * 3] var23.key[var22.R[n]] += var22.key[n * 3]
for e in range(1, 24): var23.key[e] += var23.key[e - 1] for i in range(24): s.add(var22.key[i] == var23.key[i])
assert (s.check() == sat) m = s.model()
key[21] = 55 key[15] = 106 key[6] = 53 key[18] = 115 key[23] = 125 key[22] = 117 key[20] = 99 key[19] = 116 key[17] = 48 key[16] = 121 key[14] = 112 key[13] = 113 key[11] = 109 key[10] = 117 key[8] = 98 key[7] = 99 key[5] = 114 key[4] = 123 key[9] = 115 key[12] = 121 key[3] = 102 key[2] = 116 key[1] = 99 key[0] = 115
for i in key: print(chr(i), end='')
|
flag
sctf{r5cbsumyqpjy0stc7u}