引言
本次分享PolarCTF靶场中所有[easy]re题目的WP。
由于文章篇幅较长(一共有22道题目),分为两期发表,本期书接前文,分享下半部分内容,适合刚接触逆向的朋友。如果你也对逆向感兴趣,或者正在准备CTF比赛,希望这些内容能给大家一些帮助。
64位ELF,直接运行:关键字符串“Please enter flag”
IDA启动!
fun1()
:a1[i] ^= 1u
check()
用于判断a1
是否和s
相等:s = shfiu777
所以flag = shfiu777 ^ 1u
intmain(){
char flag[] = "shfiu777";
for (int i = 0; i <8; i++) {
flag[i] ^= 0x1u;
}
printf("%s", flag);
return 0;
}
//right666
再md5,32位小写加密即可
64位exe。运行以后发现,随便输入会输出“Err"
看眼endoce()
:对flag
的每位+2
那flag是啥嘞:shift+f12
里有一串诡异字符。可以试试
intmain(){
char flag[] = "asdfgcvbnmjgtlop";
for (int i = 0; i <strlen(flag); i++) {
flag[i] +=2;
}
printf("%s", flag);
return 0;
}
//cufhiexdpolivnqr
64位ELF。运行发现:会输出”no no no"
IDA启动!
挨个看吧。
enkey()
:循环32次,134520896 + 96 = 134520992
看看这俩内容都是啥:
134520896: key = 5055045045055045055045055045055
134520992: flag
的位置
所以enkey()
就是让flag
和key
按位异或。
reduce()
:循环31次,flag
每位都-1
check()
:对比flag
和d^XSAozQPU^WOBU[VQOATZSE@AZZVOF
反过来就是:
-
d^XSAozQPU^WOBU[VQOATZSE@AZZVOF
每位都+1 -
然后和
key
按位异或
intmain(){
char flag[] = "d^XSAozQPU^WOBU[VQOATZSE@AZZVOF";
char key[] = "5055045045055045055045055045055";
for (int i = 0; i <strlen(flag); i++) {
flag[i]++;
flag[i] ^= key[i];
}
printf("%s", flag);
return 0;
}
//PolarDNbecomesbiggerandstronger
64位exe。直接运行发现关键字符串。
IDA启动!
非常eazy啊,key_num[i]-1 = name; key_password[i]-2 = password
key_num = 192168109; key_password = root
intmain(){
char key_num[] = "192168109";
char key_password[] = "root";
for (int i = 0; i <strlen(key_num); i++) {
key_num[i]--;
}
for (int i = 0; i < strlen(key_password); i++) {
key_password[i] -= 2;
}
printf("name = %sn", key_num);
printf("password = %sn", key_password);
return 0;
}
//name = 0810570/8
//password = pmmr
//0810570/8pmmr
检验一下:
拼接起来md5即可。
等等,不对?
原来是眼睛不好使,没注意人家只替换了7个数
intmain(){
char key_num[] = "192168109";
char key_password[] = "root";
for (int i = 0; i <=6; i++) {
key_num[i]--;
}
for (int i = 0; i <=3; i++) {
key_password[i] -= 2;
}
printf("name = %sn", key_num);
printf("password = %sn", key_password);
return 0;
}
//name = 081057009
//password = pmmr
这下对了!
64位可执行。
这,我猜是base64,直接在线解密试试:
赢!但是还是看看程序
遗憾!并不是base64的加密程序QAQ。收工
64位exe
这几个函数连起来的意思就是:input.len == 32
继续看Do()
函数:input = cAry[i]-2; cAry = "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:"
intmain(){
char key_num[] = "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:";
for (int i = 0; i <=31; i++) {
key_num[i]-=2;
}
printf("%sn", key_num);
return 0;
}
//0edc6a6a2abc352d58a4a98919590ed8
这个half right是什么意思呢?
不管了先直接包裹上flag提交试试,比较这个看起来很像md5加密之后的值。
豪德,不对。
解密试试呢?
F1laig
。这下对了!
32位exe。IDA直接跟进main
函数
input[i] ^= 9u == str1[i]
太简单了哇!直接str1[i] ^= 9u
就是flag了
intmain(){
char flag[] = "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t";
for (int i = 0; i < strlen(flag); i++) {
flag[i] ^= 9u;
}
printf("%sn", flag);
return 0;
}
//flag{17625630b7902ac99f735f61ea21a0e2}
64位ELF,IDA直接启动。
下载下来发现是apk。安装到雷电模拟器里看看。
疑似没做竖屏适配。调设置重启一下,发现还是乱码。
OK!上手段——jadx打开,直接搜索flag{
不对?!
好吧。回到雷电模拟器,用开发者助手提取:
这下对了
这个名字——我听话,用 jadx 直接打开,然后搜索字符串:
结束
32位exe。但是注意:Section
是乱码。丢进虚拟机里运行发现果然运行不了。
拽进ida里发现会创建一个新文件,感觉不对。然后搜了一下writeup,好像这个文件有毒。暂停解题
32位可执行文件。IDA没看出名堂,进x64dbg试试。
根据题目名,猜测有很多无用代码,所以直接搜索字符串找到关键代码部分
简单分析(内容写注释里了):
分析认为junkcode.1F1258
是判断函数:
-
调用该函数后,有个jump,一个会输出funny(疑似成功?),一个会输出"no"。
-
运行测试时,发现输错 flag 就会输出"no"
下断点准备跟进去看,结果发现eax里就是flag~
原文始发于微信公众号(SecNL安全团队):PolarCTF[RE][easy]全解(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论