太久没有写re题了,今天来re看了看
首先简单的看一看代码整体结构
很容易就可以知道,这里是个按表与下标来验证的,一个取余一个除数,不就是除数*商+余数等于原数,所以我们要求的就是原数
写出一下脚本
#include<iostream> #include<string> using namespace std; int main() { string s1 = "(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&"; string s2 = "55565653255552225565565555243466334653663544426565555525555222"; string s3 = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:"ZXCVBNM<>?zxcvbnm,./"; string s4 = ""; for (int j = 0; j < 62; j++) { int idx1 = -1, idx2 = -1; for (int i = 0; i < s3.size(); i++) { if (s3[i] == s2[j]) { idx1 = i; } if (s3[i] == s1[j]) { idx2 = i; } } s4 = s4+(char)(idx1*23 + idx2); } cout << s4; }
接下来看了看UnDecorateSymbolName函数,百度了一下,让函数容易识别,也就是C++在编译函数的时候,会把一下关键字用些特殊的符号代替,这里我就直接去嫖了下别人师傅的wp
得到的原函数是:?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z
接着网上看,v14是我们输入的,进入了v4,然后经过了一些奇怪的加密,不过这个name其实就是我们上面求出来的函数名
在我点进去这个函数的时候,发现是个递归函数,然后一个一个的赋值,所以可以知道只是简单的换位而已
并且通过动调,可以进一步得到验证
接下来输入A-Z再然后0-4输入进去,查看其交换的顺序即可
这里接着用下43v3rY0unG师傅的博客,差点忘了,上面那个递归函数是个二叉树,没有仔细逆(用不惯ida的调试(没想到我的ida终于可以调试了,以前一调试直接卡死),周末有时间,拿x64dbg调试一下试试)
#include <stdio.h> #include <string.h> int main() { char name[32] = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z"; int biao[] = { 0x50, 0x51, 0x48, 0x52, 0x53, 0x49, 0x44, 0x54, 0x55, 0x4a, 0x56, 0x57, 0x4b, 0x45, 0x42, 0x58, 0x59, 0x4c, 0x5a, 0x5b, 0x4d, 0x46, 0x5c, 0x5d, 0x4e, 0x5e, 0x5f, 0x4f, 0x47, 0x43, 65 }; char input[32] = { 0 }; int i; for (i = 0; i < strlen(name); i++) input[biao[i] - 65] = name[i]; puts(input); return 0; }
在md5加密得到
可惜这种题目现在都是签到题了,都不会出了,毕竟数据结构起步才是个签到题,不过最近补了写3环和0环知识,感觉又可以接着往下刷了