CG-CTF是南邮的平台,题目都很不错,这里记录一下部分题解决题目的思路和方法
Hello,RE!
打开程序,发现输入flag,用OD打开,注意到是将输入的字符串和flag直接进行比较,所以单步调试直接找到flag
ReadAsm2
这题考的是直接读汇编的能力,代码贴在下面
1 | int main(int argc, char const *argv[]) |
1 | 00000000004004e6 <func>: |
发现这段汇编的作用就是实现input[i]^i,所以实现上面代码输出得到flag
1 | s = [0x0, 0x67, 0x6e, 0x62, 0x63, 0x7e, 0x74, 0x62, 0x69, 0x6d, |
输出flag为:
1 | flag{read_asm_is_the_basic} |
Py交易
本题是python的反编译,使用在线工具或uncompyle6将pyc文件反编译,得到代码
1 | import base64 |
研究代码,发现我们只要将correct逆向解密,就可以得到正确的flag,所以得到如下exp:
1 | import base64 |
输出flag为:
1 | nctf{d3c0mpil1n9_PyC} |
WxyVM
下载下来不知道是什么文件,记事本打开,开头ELF,所以直接拖进IDA反编译,main函数如下:
1 | __int64 __fastcall main(__int64 a1, char **a2, char **a3) |
一开始认为需要输入一个24位的flag,然后和dword_601060每一位都相等即可,但是中间的sub_4005B6()函数对我们输入的flag还进行了一些变换,所以需要把dword_601060对应的进行反变换才能得到应该输入的正确的flag
sub_4005B6()函数如下:
1 | __int64 sub_4005B6() |
用IDA将byte_6010C0导出,用python进行逆向处理
1 | s = [0xc4, 0x34, 0x22, 0xb1, 0xd3, 0x11, 0x97, 0x7, 0xdb, 0x37, 0xc4, 0x6, 0x1d, 0xfc, 0x5b, 0xed, 0x98, 0xdf, 0x94,0xd8, 0xb3, 0x84, 0xcc, 0x8] |
这里有两件事需要注意,第一是dword只需要取最后一个字节,第二是逆运算时要从最后三位向前计算,最后输出flag:
1 | nctf{Embr4ce_Vm_j0in_R3} |
maze
极其无聊的迷宫题……
找到地图、起点终点和上下左右分别对应的键就可以了
1 | nctf{o0oo00O000oooo..OO} |
WxyVM2
拖进IDA反编译,发现函数非常大,操作特别多,但是仔细看发现最后要验证的都是byte类型,所有对dword的操作都是无效的,所以把所有操作拷贝到文件(export_results.txt)中,先进行过滤操作,过滤出需要的操作,最后的验证过程如下:
1 | for ( i = 0; i <= 24; ++i ) |
所以操作之后的数组和dword_694060数组的每个数的最后一位相同,将数组导出,进行逆运算得到原来输入的flag,python代码如下:
1 | import re |
这里要注意一点,python没有++和–操作,所以直接++和–的传唤算不出正确值,在这里卡了一会儿才发现问题。
运行程序输出flag:
1 | nctf{th3_vM_w1th0ut_dAta} |
你大概需要一个优秀的mac
这是一个macos程序,没法直接打开,所以还是拖进IDA反编译,发现需要输入一个56位的flag,然后经过几个函数处理之后与一个数组进行比较,相同则输入的是正确的flag,所以还是一样进行一个逆运算
反编译出来的代码如下:
1 | scanf("%s", &v4); |
所以将byte_100000ED0处的数组导出,进行逆运算,代码如下:
1 | s = [0x15, 0x1F, 0x12, 0x14, 0x08, 0x3A, 0x46, 0x2C, 0x07, 0x1B, 0x51, 0x13, 0x3F, 0x57, 0x08, 0x05, 0x3F, 0x30, 0x32, |
运行程序输出flag:
1 | flag{I5_th1s_7he_PR1c3_I'M_PAyiNG_f0r_my_pA57_m1stAk35?} |
Comments