题目名称:EASYMAZE
出题人:Gyan
IDA不好用了?因为这是C#
扔进dnspy
进入check函数发现这是一个迷宫
从C经过*走到X,0为下,1为上,2为右,3为左
路径:2220000000221220221221133333311222211220022112220030020002
提交dino{2220000000221220221221133333311222211220022112220030020002}发现不对?
继续审计代码,找到两个关键的地方
第一个地方是将数据转换成十六进制,第二个地方是将这个十六进制的数据拆成前两位和后两位,即 ‘a’ =>0xa =>1010 => array2 = {10,10},所以我们应该一次"走两步“
即22 =>1010 =>a,以此类推
|
|
题目名称:嘘!
出题人:Gyan
双击后打不开????直接扔进IDA
发现一大堆看不懂的东西!!!
往旁边函数里一看,发现一个创建窗口的函数WinMain
点击即得flag
题目名称:捉迷藏
出题人:DorinXL
查壳!出这个题的师傅本来没加壳的,我(Nameless)手贱加了:)
直接upx -d 脱壳 (记得用高版本的upx,不然可能失败)手脱可无视
脱完壳后扔进ida,shift+F12一把梭
在几个有字符串的地方找到数据,然后直接按R
如:
找到其他几段后,拼接出来就行
题目名称:base64
出题人:DorinXL
ida64打开,发现是base64编码加密
看左边函数,会发现ohMyGod函数,进去看后,发现更换了base64的表(这里如果不懂,要去看base64的原理)
写出新表的脚本
|
|
得到新表后,用base64的脚本or工具直接解出
题目名称:BabyAndroid
出题人:Nameless
直接扔进JEB
进去后发现看不懂,直接decompile
稍微代码审计一下发现就是一个简单的异或
上脚本
|
|
题目名称:方程组?
出题人:Nameless
解线性方程组
直接上脚本
|
|
题目名称:Crypto
出题人:Nameless
两种解法
打开IDA,会发现key = “CDUTCTF” ,从函数名可以分析出采用的是rc4加密
解法1.已知密钥为CDUTCTF,直接用rc4进行计算即可
|
|
解法2.gdb调试
- 在rc4_crypt处下断点
- 向下单步调试(注意堆栈和寄存器的信息)
- 得到flag
题目名称:DinoTree
出题人:DorinXL
丢进f5,代码审计发现两个关键地方,查看qwq和qaq数组
可以看到两个字符串,那么进行反解,要注意看for循环的长度
|
|
解出后,根据字符串的提示,以及题目的提示,知道这是树的中序和后序遍历
那么需要求出前序遍历
中序:noiFu{DT_n3re}
后序:onuF{iT_3}ernD
求解前序的过程是手写的,这里不再提出
前序:Dino{Fun_Tr3e}
即为flag
题目名称:PaperTiger!!!
出题人:Nameless
扔进IDA,发现找不到main函数,shift+f12查看字符串,找到关键字符串,双击跟进
鼠标放在这里,按ctrl+X查看交叉引用,即查看哪里用到了这个字符串
发现F5不好使了,提示sp指针有问题。根据参考资料,调整最后面的堆栈指针
此时便可F5成功,审计代码知,就是简单的xor而已
写脚本计算出来即可
|
|
所以如题,真的是个纸老虎:)
题目名称:你不会真的要用CE吧
出题人:Gyan
IDA打开,根据提示,关闭ASLR(如图)
然后打开od,搜索字符串
去IDA,按G,随便选上面的一个地址跳转,即可来到主函数
找到关键代码部分
查看这句话的地址
在od中,按ctrl+g跳转到该地址,并按f2下断点,然后f9运行程序
可以发现程序停在了断点处,修改旁边的标志位,使得跳转不成立
然后再按一下f9,运行程序,点击确定,发现flag已经出来了
题目名称:fork bomb bomb bomb!!!
着手静态
- 载入IDA 来到主函数进行分析
- F5查看伪代码
- 找到回车前的输出字符串
-
- 熟悉C语言就能看出,这里向/tmp目录里面输出了一个文件(.virus)
- 补充linux里的/tmp目录特点:任何人都可以进行读写,有些linux发行版会在关机后清空/tmp目录。关于linux的使用请参考相关书籍如:鸟哥的linux私房菜
- 利用system()函数执行了/tmp里的文件,由于linux的mask,/tmp/.virus这个shell脚本是没有执行权限的,所以使用bash调用
- /tmp/.virus脚本的内容是一个很经典的fork炸弹,百度就能查到
- 这个程序的恶意代码和关键代码的耦合性不高,所以咱们能有好几种方法绕过恶意代码,接下来我们尝试使用静态patch和动态调试绕过恶意代码拿到flag,静态逆向写逆向脚本这里不做讨论
|
|
静态patch
把73行到84行全部patch掉
选中87行头,tab键回到流程图,空格看汇编
记下地址:0x402681
再f5回到伪代码
选中73行的system位置,按tab回到流程图,再按空格回到汇编代码
为了保证平衡,我们在call system上面一条汇编指令lea处
点ida菜单栏的edit–>patchprogram–>assamble
键入jmp 0x402681,只改这一条,下面的不用管,canel取消
点ida菜单栏的edit–>patchprogram–>aplly
把patch好的程序拖进linux
加上执行权限chmod +x ez_virus
执行./ez_virus
gdb动态调试
还是刚才看到的那个地址,
gdb ez_virus
因为跳了5次,所以我们可能需要更改5次eip(64位叫rip)
在gdb里面b *0x4025c1
设断点
r运行
运行到这里的时候,我么需要控制程序流程跳过恶意代码
在ida里面找到
由于这里是jz,所以可能不一定会进入正常代码(这里对应的是if(v13)这个变量在恶意代码中是否分配成功)
所以我们尝试进入下一句汇编(就当他没有跳转,按照程序逻辑,cmp的结果为0(即v13分配成功)则跳转,我们需要cmp的结果不为0,所以,这句需要不执行),则按照汇编流程,下一句的地址是0x402681
设置eip
set $eip=0x402681
这样就跳过了第一次恶意代码
按c继续程序,程序会再次断在刚才设置的断点
重复设置eip
set $eip=0x402681
再按c继续程序
重复5次,得到flag