BUUCTF reverse [2019红帽杯]childRE 未完~

分析了半天只分析出了下半部分,上半部分看wp也没搞太明白,还是太菜了,不过话说这红帽杯一直这么离谱吗,做了好几道红帽的题都不太会,呜呜呜,泪目了。

没壳,用ida64打开。

BUUCTF reverse [2019红帽杯]childRE 未完~

查看获取flag的条件

BUUCTF reverse [2019红帽杯]childRE 未完~

BUUCTF reverse [2019红帽杯]childRE 未完~

我需要先求出outputstring字符串,经过分析可以知道,outputstring字符串与23进行取余数和相除运算之后作为a123456789qwer函数的索引并与str1和str2字符串相等。

BUUCTF reverse [2019红帽杯]childRE 未完~

str1 = "(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&"
str2 = "55565653255552225565565555243466334653663544426565555525555222"
str3 = '1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;,ASDFGHJKL:"ZXCVBNM<>?zxcvbnm,./'
 
name = ''
 
for i in range(62):
    name += chr(str3.index(str1[i]) + str3.index(str2[i])*23 )
 
print (name)

这一部分也是看的大佬的wp,其实这一部分的计算我搞不太懂为什么要将两边的结果加在一起,感觉一个式子应该也是可以求出正确结果,emmmm暂时放一下,等以后来解决,下面就完全是看的大佬的wp了,先给大佬们磕一个。

BUUCTF reverse [2019红帽杯]childRE 未完~

然后是看这个UnDecorateSymbolName函数

通过看这个师傅的博客https://www.freesion.com/article/6515734088/,可以解出我们的出来的字符串应该是?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

还剩下最后一个部分,用ida进行动态调试,下断点,输入31个字符。

BUUCTF reverse [2019红帽杯]childRE 未完~

用F7进行单步调试,我们通过汇编代码可以知道name我们已经算出来了,它是被result给赋值的,通过汇编代码,可以看出,是将al赋值给了result

BUUCTF reverse [2019红帽杯]childRE 未完~

多运行几次可以得到al的值。

贴出解题脚本

#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;
}

呜呜呜,实在是不会,数据结构也还没学,等有时间再来解决一下。

flag{63b148e750fed3a33419168ac58083f5}

上一篇:JPEG算法解密


下一篇:Autumn2.0.1_WP扁平化博客自媒体文章资讯类网站模板