PolarCTF[RE][easy]全解(下)

admin 2025年3月11日20:39:13评论35 views字数 3486阅读11分37秒阅读模式

引言

本次分享PolarCTF靶场中所有[easy]re题目的WP。  

由于文章篇幅较长(一共有22道题目),分为两期发表,本期书接前文,分享下半部分内容,适合刚接触逆向的朋友。如果你也对逆向感兴趣,或者正在准备CTF比赛,希望这些内容能给大家一些帮助。

PolarCTF[C^]

PolarCTF[RE][easy]全解(下)

64位ELF,直接运行:关键字符串“Please enter flag”

PolarCTF[RE][easy]全解(下)

IDA启动!

PolarCTF[RE][easy]全解(下)

fun1()a1[i] ^= 1u

PolarCTF[RE][easy]全解(下)

check()用于判断a1是否和s相等:s = shfiu777

PolarCTF[RE][easy]全解(下)

所以flag = shfiu777 ^ 1u

#include<stdio.h>intmain(){    char flag[] = "shfiu777";    for (int i = 0; i <8; i++) {        flag[i] ^= 0x1u;    }    printf("%s", flag);return 0;}//right666

再md5,32位小写加密即可

PolarCTF[babyRE]

PolarCTF[RE][easy]全解(下)

64位exe。运行以后发现,随便输入会输出“Err"

PolarCTF[RE][easy]全解(下)

看眼endoce():对flag的每位+2

PolarCTF[RE][easy]全解(下)

那flag是啥嘞:shift+f12里有一串诡异字符。可以试试

PolarCTF[RE][easy]全解(下)

#include<stdio.h>#include<string>intmain(){    char flag[] = "asdfgcvbnmjgtlop";    for (int i = 0; i <strlen(flag); i++) {        flag[i] +=2;    }    printf("%s", flag);return 0;}//cufhiexdpolivnqr
PolarCTF[easyre1]

PolarCTF[RE][easy]全解(下)

64位ELF。运行发现:会输出”no no no"

PolarCTF[RE][easy]全解(下)

IDA启动!

PolarCTF[RE][easy]全解(下)

挨个看吧。

enkey():循环32次,134520896 + 96 = 134520992

PolarCTF[RE][easy]全解(下)

看看这俩内容都是啥:

134520896: key = 5055045045055045055045055045055

PolarCTF[RE][easy]全解(下)

134520992: flag的位置

PolarCTF[RE][easy]全解(下)

所以enkey()就是让flagkey按位异或。

reduce():循环31次,flag每位都-1

PolarCTF[RE][easy]全解(下)

check():对比flagd^XSAozQPU^WOBU[VQOATZSE@AZZVOF

PolarCTF[RE][easy]全解(下)

反过来就是:

  • d^XSAozQPU^WOBU[VQOATZSE@AZZVOF每位都+1

  • 然后和key按位异或

#include<stdio.h>#include<string>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
PolarCTF[Sign Up]

PolarCTF[RE][easy]全解(下)

64位exe。直接运行发现关键字符串。

PolarCTF[RE][easy]全解(下)   

IDA启动!

PolarCTF[RE][easy]全解(下)

PolarCTF[RE][easy]全解(下)

非常eazy啊,key_num[i]-1 = name; key_password[i]-2 = password

key_num = 192168109; key_password = root

PolarCTF[RE][easy]全解(下)

#include<stdio.h>#include<string>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

检验一下:

PolarCTF[RE][easy]全解(下)

拼接起来md5即可。

等等,不对?

原来是眼睛不好使,没注意人家只替换了7个数

PolarCTF[RE][easy]全解(下)

#include<stdio.h>#include<string>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

这下对了!

PolarCTF[? 64]

PolarCTF[RE][easy]全解(下)

64位可执行。

PolarCTF[RE][easy]全解(下)

这,我猜是base64,直接在线解密试试:

PolarCTF[RE][easy]全解(下)

赢!但是还是看看程序

PolarCTF[RE][easy]全解(下)

PolarCTF[RE][easy]全解(下)

遗憾!并不是base64的加密程序QAQ。收工

PolarCTF[Why32]

PolarCTF[RE][easy]全解(下)

64位exe

PolarCTF[RE][easy]全解(下)

PolarCTF[RE][easy]全解(下)

PolarCTF[RE][easy]全解(下)

PolarCTF[RE][easy]全解(下)

这几个函数连起来的意思就是:input.len == 32

继续看Do()函数:input = cAry[i]-2; cAry = "2gfe8c8c4cde574f7:c6c;:;3;7;2gf:"

PolarCTF[RE][easy]全解(下)

#include<stdio.h>#include<string>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加密之后的值。

豪德,不对。

解密试试呢?

PolarCTF[RE][easy]全解(下)

F1laig。这下对了!

PolarCTF[康师傅]

PolarCTF[RE][easy]全解(下)

32位exe。IDA直接跟进main函数

PolarCTF[RE][easy]全解(下)

input[i] ^= 9u == str1[i]

太简单了哇!直接str1[i] ^= 9u就是flag了

#include<stdio.h>#include<string>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}

PolarCTF[re2]

PolarCTF[RE][easy]全解(下)

64位ELF,IDA直接启动。

PolarCTF[RE][easy]全解(下)

PolarCTF[layout]

PolarCTF[RE][easy]全解(下)

下载下来发现是apk。安装到雷电模拟器里看看。

PolarCTF[RE][easy]全解(下)

疑似没做竖屏适配。调设置重启一下,发现还是乱码。

OK!上手段——jadx打开,直接搜索flag{

PolarCTF[RE][easy]全解(下)

不对?!

好吧。回到雷电模拟器,用开发者助手提取:

PolarCTF[RE][easy]全解(下)

这下对了

PolarCTF[use_jadx_open_it]

这个名字——我听话,用 jadx 直接打开,然后搜索字符串:

PolarCTF[RE][easy]全解(下)

结束

【未完成】PolarCTF[另辟蹊径]

PolarCTF[RE][easy]全解(下)

32位exe。但是注意:Section是乱码。丢进虚拟机里运行发现果然运行不了。

拽进ida里发现会创建一个新文件,感觉不对。然后搜了一下writeup,好像这个文件有毒。暂停解题

PolarCTF[JunkCode]

PolarCTF[RE][easy]全解(下)

32位可执行文件。IDA没看出名堂,进x64dbg试试。

根据题目名,猜测有很多无用代码,所以直接搜索字符串找到关键代码部分

PolarCTF[RE][easy]全解(下)

简单分析(内容写注释里了):

PolarCTF[RE][easy]全解(下)

分析认为junkcode.1F1258是判断函数:

  • 调用该函数后,有个jump,一个会输出funny(疑似成功?),一个会输出"no"。

  • 运行测试时,发现输错 flag 就会输出"no"

PolarCTF[RE][easy]全解(下)

下断点准备跟进去看,结果发现eax里就是flag~

END
本文作者:白玉京

原文始发于微信公众号(SecNL安全团队):PolarCTF[RE][easy]全解(下)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月11日20:39:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PolarCTF[RE][easy]全解(下)https://cn-sec.com/archives/3829906.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息