文章目录
1.logmein
题目描述:
下载附件,将其转换为.exe,查壳发现是一个64位的ELF文件
用IDA打开,找到main函数,F5查看伪代码
分析代码的运算逻辑:
先是将指定字符串复制到v8;
s是用户输入的字符串
先比较其与v8的长度,如果长度比v8小,就进入sub_4007c0函数
可以看到输出了:Incorrect password!
如果长度大于或等于v8则进入下面的循环
如果 i >= strlen(v8) 则进入sub_4007C0()函数
同样,如果s[i]不等于后面那一连串的运算结果,则进入sub_4007C0()函数
否则进入sub_4007F0()函数
通过分析可知,算法的关键在于 V6、V7、V8 的异或处理,得到如下代码:
即可得到flag:RC3-2016-XORISGUD
2.insanity
题目描述:
查壳,发现是32位的ELF文件
拖入IDA,找到main函数,F5查看伪代码
发现是取这个字符串输出,然后,跟进strs
就发现了flag
3.getit
题目描述:
查壳发现是一个64位的ELF文件
拖入IDA
找到main函数,F5查看伪代码
找到代码的关键部分,是这个for循环
里面提到的几个参数,t和s,查看参数的值
脚本
你会发现这不太像是正确的flag
再仔细看一下题目
题目来源是SharifCTF 而这里t的值却是harifCTF
修改代码,即可得到正确的flag
4.re1
题目描述:
下载附件,查壳后,发现是Microsoft Visual c++编译的32位的程序
拖入IDA,找到main函数,F5查看伪代码
可以看到一个关键的字符串,print(aFlag),继续往上分析:
可以看到v3的值与v5有关,继续往上分析:
可以看到开头的_mm_storeu_si128()涉及到了v5,对其分析,发现它是将xmmword_413E34的值赋值给v5,所以双击413E34跟进
可以看到一堆十六进制的数
使用IDA的功能 R ,将十六进制进制的数转换为字符串。
最后的flag应该是:DUTCTF{We1c0met0DUTCTF}
补充一个知识点
假设一个十六进制数0x12345678
大端的存储方式是:12,34,56,78,然后读取的时候也是从前往后读
小端的存储方式是:78,56,34,12,然后读取的时候是从后往前读取
5.python-trade
题目描述:
打开附件:是一个.pcy文件
用反编译工具,
得到源码
脚本
得到flag:nctf{d3c0mpil1n9_PyC}
6.game
题目描述:
用OD动态调试
搜索字符串
找到了关键的字符串,双击
注意记住上面的0006E940是判断正确函数的入口点
现在我们要做的是找到判断我们输入是否正确的函数,将其跳转到判断正确的函数入口点来
此处应该是我们输入的值
设置个断点,单步运行,找到跳转的指令
将其改为:jle long 0006E940
然后运行就可得到flag
flag: zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
7. Hello, CTF
题目描述:
用IDA打开附件
找到main函数,F5查看伪代码
分析代码:
v9为我们的输入,长度≤0x11
v10储存的就是v9,和v13进行比较。相同就success
因此v13储存的就是我们要的flag
十六进制转字符串:
得到flag: CrackMeJustForFun
8.open-source
题目描述:
附件是一份c语言源码
值得注意的是第29行进行计算flag,第32行代码输出十六进制形式
式子由三个部分组成; first,second,argv[3]
第一部分:
由此处可知 first = 0xcafe
第二部分:
second = 25
第三部分:
argv[3] = “h4cky0u”
脚本:
得到flag: c0ffee
9. simple-unpack
题目描述:
查壳:
发现是upx壳
方法一:
upx -d 文件名 即可对upx壳进行脱壳
在查壳,可以看到已经没有壳了
拖入IDA
查看main就能看到flag了
flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
总结:
upx的详细使用链接:https://blog.csdn.net/The_whale_demon/article/details/104111320
cd命令介绍:https://jingyan.baidu.com/article/73c3ce28480637e50343d992.html
方法二:
IDA一二进制形式打开文件
shift+F12 查找字符串就能找到flag
参考文章:https://www.cnblogs.com/Mayfly-nymph/p/11397369.html
10.csaw2013reversing2
题目描述:
打开文件,果然,显示的是乱码
查壳:
拖入IDA,找到main函数,查看伪代码
分析代码;
此处应该是弹框显示flag值的代码,但程序运行显示的是上图所示的乱码
继续分析代码
在这个if语句中,IsDebuggerPresent()这个函数就是判断是否处于调试器中,满足条件后,进入执行语句。
接着看到sub_401000函数,双击进入
看起来是个加密函数,应该和flag有关,将v2进行一系列操作后返回,然后退出,弹出flag。然而事实上并未显示flag,所以我们猜测这个函数并没有被执行,
于是我们再用OD打开文件
搜索字符串:
可以看到有两个flag
先双击进入第一个flag
可以找到IsDebuggerPresent()函数的地址
进行if判断后,程序直接跳过了sub_401000函数,然后跳出弹框,显示乱码,所以我们需要对程序进行修改使其执行sub_401000函数。
双击修改转汇编代码,使其跳转到sub_401000函数地址的前一处也就是00DE109B,程序运行后就会执行生成flag的函数。
接下来我们还需要使弹框显示flag,所以需要修改sub_401000函数之后的跳转语句,使其跳转到弹框位置
运行:
你会发现它停在了 int 3 这个位置,将它nop掉,再运行,就能得到正确的flag
参考文章:https://blog.csdn.net/qq_43786458/article/details/102150779
11.maze
题目描述:
下载附件,用IDA打开,找到main函数,F5查看伪代码
将能转换为字符的都转换(快捷键R)
分析代码
这里表示,输入字符长度必须是24,开头必须是nctf{,结尾必须是}。在125处按R就可以变成字符。
这部分说明最后必须走到#
分析函数sub_400650
v10的下一字节减1
分析函数sub_400660
v10的下一字节加1
分析函数sub_400670
v10减1
分析函数sub_400680
v10加1
进入函数asc_601060
可以看到一个8*8矩阵
得到flag: nctf{o0oo00O000oooo…OO}