菜猫一只,对着大佬们的wp复现(好难啊…我好菜5555) 参考了官方wp和这位大佬的文章REVERSE-COMPETITION-NEPCTF
题目链接: 链接:https://pan.baidu.com/s/1PzZ7uYlxSHjj9L7-iuWqjQ 提取码:8lw2 复制这段内容后打开百度网盘手机App,操作更方便哦
无壳,ida32位打开,交叉引用字符串plz input right num:\n:
来到sub_4010A0()
函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 void __noreturn sub_4010A0 () { __int64 v0; char Dst; memset (&Dst, 0 , 0xFF u); dword_403378 = (int )malloc (8u ); Memory = (void *)dword_403378; *(_DWORD *)(dword_403378 + 4 ) = 0 ; sub_401020("plz input right num:\n" , Dst); sub_401060("%s" , (unsigned int )&Dst); v0 = atoi64(&Dst); sub_401120(v0, HIDWORD(v0)); }
进入sub_401120
这里普及一下 HIDWORD:指的是低位 LODWORD:指的是高位 关于13行的sub_401F00
的解释 关于v3==Fb72>&6的解释 我们之前在字符串窗口找到了flag right之类的字样,跳转过去之后发现了最后是判断aFb726 向上看之后发现 双击aFb726得到Fb72>&6
查看byte_402194 2163qwe)(*&^%489$!057@#><A
17行的sub_401160()应该是有比较,比较的内容就是v3
可以写脚本了
1 2 3 4 5 6 7 8 9 10 11 12 arr="2163qwe)(*&^%489$!057@#><A" v3="Fb72>&6" flag=[] for i in range (len (v3)): v4=chr (ord (v3[i])^7 ) index=arr.find(v4) flag.append(index) sum =0 for i in range (len (flag)-1 ,0 ,-1 ): sum =(flag[i]+sum )*26 sum +=flag[0 ]print(sum )
跑出来结果是: flag:Nep{md5(518100101)}
以下是官方给出的本题的源码
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 源码: #include <stdio.h> #include <stdlib.h> #include <windows.h> const char jinzhi_table[] = "2163qwe)(*&^%489$!057@#><A" ;const int jz = 26 ;char key[] = { "Fb72>&6" };struct node {char data;struct node * next ;}*head, * cur_node; void check_the_flag () ; void linklist_add (char i) ;void base_conversion (long long int n) ;int del_linked (int sum) ;int v6 = 0 ;int main () {char input[255 ] = { 0 };long long int x;head = cur_node = (struct node*)malloc (sizeof (struct node)); cur_node->next = NULL ; printf ("plz input right num:\n" );scanf_s("%s" , input, 32 ); x = _atoi64(input); base_conversion(x); return 0 ;} void base_conversion (long long int n) {int i = 0 ;char a;while (n){ a = jinzhi_table[n % jz]; n = n / jz; linklist_add(a ^ 7 ); i++; }check_the_flag(); } void linklist_add (char i) {cur_node->next = (struct node*)malloc (sizeof (struct node)); cur_node->data = i; cur_node = cur_node->next; cur_node->next = NULL ; } void check_the_flag () {int i, sum = 0 ;struct node * tmp = head;for (i = 0 ; i < 8 ; i++){ if (tmp == NULL ) {break ;} if (tmp->data == key[i]) {sum++; } tmp = tmp->next; } int code = del_linked(sum);if (sum != 8 ) {puts ("flag is Error!!!" );exit (code);} else {puts ("flag is Right!!!, please md5('Nep{you_input_num}') submit th4 flag" );system("pause" ); exit (code);} } int del_linked (int sum) {if (head == NULL ) {return -1 ;} int tmp = sum;while (head != NULL ) {cur_node = head; head = head->next; free (cur_node);tmp -= 1 ; } return tmp;}