寒假日常刷题(ctf——reverse)(二)
[MRCTF2020]Transform
首先查壳后发现是64位无壳,运行后进ida
查看伪代码在这里面可以看到大概思路是输入一个字符串str,之后字符串每一位都用dword-40f040来打乱,紧接着是在与它异或一下,这是第一重循环
之后第二重循环是就是循环判断改变过的字符串和byte_414040比较是否相同,由此可知,最后的byte_414040字符串就是最终处理结束的字符串,直接按照这个思路写代码
#include <iostream>
using namespace std;
int lowbit(int x)
{
return x & -x;//在原本伪代码里面看到了一个大写的lowbit,以为是树状数组里面的lowbit函数,实际上并不是,直接异或就可以
}
/*
LOWORD()得到一个32bit数的低16bit
HIWORD()得到一个32bit数的高16bit
LOBYTE()得到一个16bit数最低(最右边)那个字节
HIBYTE()得到一个16bit数最高(最左边)那个字节
*/
int nm[50] = {0x9, 0x0A, 0x0F, 0x17, 0x7, 0x18, 0x0C, 0x6, 0x1, 0x10, 0x3, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16, 0x4, 0x0D, 0x13, 0x14, 0x15, 0x2, 0x19, 0x5, 0x1F, 0x8, 0x12, 0x1A, 0x1C, 0x0E, 0x8};
int op[50] = {0x67, 0x79, 0x7B, 0x7F, 0x75, 0x2B, 0x3C, 0x52, 0x53, 0x79, 0x57, 0x5E, 0x5D, 0x42, 0x7B, 0x2D, 0x2A, 0x66, 0x42, 0x7E, 0x4C, 0x57, 0x79, 0x41, 0x6B, 0x7E, 0x65, 0x3C, 0x5C, 0x45, 0x6F, 0x62, 0x4D, 0x3F};
int fa[50];
int main ()
{
for(int i = 0; i < 33; i ++) op[i] ^= nm[i];
for(int i = 0; i < 33; i ++) fa[nm[i]] = op[i];
for(int i = 0; i < 33; i ++)
{
char c;
c = fa[i];
cout << c;
}
return 0;
}
最终得到flag{Tr4nsp0sltiON_Clph3r_1s_3z}
[WUSTCTF2020]level2
前面两道题不太会做,先跳到了这道题
首先是32位有壳,直接upx脱壳
之后拖到ida里面不用操作直接一眼看到答案
已经是比较靠后的题了,解出来的人也只有七百多,但是实际上flag就是上图黄字,属实惊到我了doge
flag{Just_upx_-d}