西湖论剑小结-re题解(附题)

凤凰涅槃,浴火重生。
这次西湖论剑成功自闭
但是只有经历多了,总结多了,才能更加强大。
希望有朝一日我也能浴火重生

看题吧

easyCpp

easyCpp
拖进ida看逻辑
1
很复杂,毋庸置疑。
先把整体加密算法说下吧,就是录入16个数
然后每个数(除去第一个)都加上第一个数
然后逆置
最后进行比较来check
加密算法不难,仔细调还是能调出来。
还有一个写法,用angr
万能模板一套就行//也就6行代码
2
可以看到输出一堆数
把每十位看成一个输入
3
因为angr默认是无符号的所以是这样
正常的话输入的除了第一位其他都是负数
4
但是我建议不到迫不得已别用angr
这题加密算法比较简单,就是个加法和逆序所以能跑出来
差不多花了10多分钟
但是如果逆向这么容易,只需要一个angr就能解决,那岂不是人人都能逆向了吗?
所以,还是自己动手好好调试一下,看看里面到底是怎么对输入进行变换的,这样才能提升自己的安全能力
就我个人而言,angr只不过是一个救命稻草而已,但不得不承认,有时候angr确实很好用。
特别是针对一些加密算法简单,但程序晦涩难懂的题型。
如VM类。
但只要稍微复杂一些的算法,angr的万能模板就废了。
比如第二题,一个原封不动的base58
angr跑一天都不会跑出答案。
好了
现在来讲题目正常写法
5
我都写在注释里了
跟进去看看可以看到输入的变换
解密的话也很简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include <stdio.h>
int main()
{
long long int a[16]={987,610,377,233,144,89,55,34,21,13,8,5,3,2,1,1};
int i;
printf("987\n");
for(i=1;i<16;i++)
{
printf("%d\n",a[i]-a[0]);
}
return 0;
}

这边直接用c了

testre

testre
这题其实就是个base58。。。
没有什么难的地方
曾经也写过俩到base58的题目,但是都没有认真看,看到有码表且数量为58就直接base58了
导致这次没有很快认出来加密算法
D9cS9N9iHjMLTdA8YSMRMp
把这串字符串解一下就出答案了
总结一下一般base58的特征
6
就是这段膜58再除的
其实就是256进制转成58进制然后取码表

Junk_Instruction

Junk_Instruction
mfc程序
加密算法是
rc4加上字符串逆置
首先定位一下
7
主要check在这
进去看看
8
可以看到JUMPOUT
果然和标题一样
就是垃圾代码。。。
耐心跟进去可以发现是rc4
然后可以解了
输入一大串a
看加密后的
再异或a
然后与比较的异或
这边其实只比较32个//规定输入38个
其实可以猜到就是flag{xxxxxxxxx}
程序对前5个和最后一个输入没有限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a = [0x5C, 0x85, 0x84, 0x77, 0xCC, 0x8F, 0x1C, 0x28, 0x3A, 0x67,
0x98, 0x47, 0xC8, 0x28, 0xA9, 0xAA, 0x88, 0x25, 0x32, 0xB7,
0xA5, 0xE5, 0x8E, 0x07, 0xD2, 0x9F, 0x5A, 0x59, 0xCC, 0x82,
0x13, 0xA2]
for i in range(len(a)):
a[i] ^= ord('a')
c = [0x5B, 0xD6, 0xD0, 0x26, 0xC8, 0xDD, 0x19, 0x7E,
0x6E, 0x3E, 0xCB, 0x16, 0x91, 0x7D, 0xFF, 0xAF, 0xDD, 0x76,
0x64, 0xB0, 0xF7, 0xE5, 0x89, 0x57, 0x82, 0x9F, 0x0C, 0x00,
0x9E, 0xD0, 0x45, 0xFA]
flag = '}'
for i in range(len(c)):
flag += chr(c[i]^a[i])
flag += '{galf'
print flag[::-1]
#973387a11fa3f724d74802857d3e052f
文章目录
  1. 1. easyCpp
  2. 2. testre
  3. 3. Junk_Instruction
|