分析了半天只分析出了下半部分,上半部分看wp也没搞太明白,还是太菜了,不过话说这红帽杯一直这么离谱吗,做了好几道红帽的题都不太会,呜呜呜,泪目了。
没壳,用ida64打开。
查看获取flag的条件
我需要先求出outputstring字符串,经过分析可以知道,outputstring字符串与23进行取余数和相除运算之后作为a123456789qwer函数的索引并与str1和str2字符串相等。
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了,先给大佬们磕一个。
然后是看这个UnDecorateSymbolName函数
通过看这个师傅的博客https://www.freesion.com/article/6515734088/,可以解出我们的出来的字符串应该是?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z
还剩下最后一个部分,用ida进行动态调试,下断点,输入31个字符。
用F7进行单步调试,我们通过汇编代码可以知道name我们已经算出来了,它是被result给赋值的,通过汇编代码,可以看出,是将al赋值给了result
多运行几次可以得到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}