DASCTF babyre
DASCTF babyre分析首先放入IDA中看
括号里面的内容是二进制资源COD,此资源随后在sub_140001087中被异或解密
然后取提取该COD资源,用resource hacker(之前只用过一次,做题的时候没想到/(ㄒoㄒ)/~~)
提取好只后,进入sub_140001087函数看
这里直接用IDApython解码的时候出现了问题,然后我就交叉引用了F000这里的数据,发现还有一段在用这里的数据
然后动调一下,得到正确的异或因子
然后写一个脚本,把需要的内容dump出来
f = open("COD101.bin","rb").read()key=[0x18, 0x57, 0x68, 0x64]arr = []for i,j in enumerate(f): arr.append(key[i%4]^j)open("dump","wb").write(bytes(arr))
dump出来的东西有很多花,然后去花,看到%0x100也就是%256知道是RC4魔改(最后写脚本的时候主义 ...
HDCTF enc
HDCTF enc分析进入IDA发现三个函数
先进入第一个函数sub_411523
一个简单的tea加密
key
加密内容
Tea解密脚本#include <stdio.h>#include <stdint.h> // 使用uint32_t数据类型需要包含此头文件#include <string.h> #include<iostream> using namespace std;// 定义加密函数void tea_decrypt(uint32_t *v, uint32_t *k) { uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i; // 根据TEA算法,解密轮次的计算需要初始化sum uint32_t delta = 0x9e3779b9; for (i = 0; i < 32; i++) { v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) ...
HDCTF double_code
HDCTF double_code分析首先放入IDA看不出是干什么,然后去看有些什么字符串,看到写入进程然后交叉进去看一下
这里写入进程前就一定是加载进程模块,于是点进去看一下
进去这个sub_14001F000函数,可能是shellcode,就想办法dump出来
然后进去HEX界面,将其复制到010或winhex中保存下来就能看到了
dump内容
就是简单的switch-case结构,写脚本
脚本#include<stdio.h>#include<string.h>int main (){ int opcode[]={1,5,2,4,3}; unsigned char flag[]={ 0x48,0x67,0x45,0x51,0x42,0x7b,0x70,0x6a,0x30,0x68, 0x6c,0x60,0x32,0x61,0x61,0x5f,0x42,0x70,0x61,0x5b, 0x30,0x53,0x65,0x6c,0x60,0x65,0x7c,0x63,0x69,0x2d, 0x5f,0x4 ...
GDOUCTF doublegame
GDOUCTF doublegame分析打开程序,发现是一个贪吃蛇游戏,直接上CE
看来是要达到多少分才行,那么去找得分的基址
这个出题人也是牛,直接是静态地址,都不带一点偏移的,一下子就知道了,然后就直接改就行了
直接进入第二关,第二关一看就是个迷宫,先去IDA看一下移动的按键和哪个是猫哪个是终点
然后开始走迷宫
走完迷宫后让我们输入key,去IDA中看一下
看来是需要知道第一关到底要达到多少分才能知道key了。这里游戏是过了第一关就直接进入第二关,说明函数可能存在调用关系
那么直接找一下是谁调用的第二关
这里可以看到是这里调用了刚刚的迷宫函数,接着去看看他是哪里的
继续查看是谁调用了它
这里看到了GAME OVER就知道这里应该是第一个游戏的函数,然后这个>13371337应该就是要达到的分数才会进去那个找猫的函数,所以key就是13371337
然后就是最后一个走迷宫了
走出迷宫后md5一下再加上刚刚的分数就是flag了
HZCTF{811173b05afff098b4e0757962127eac13371337}
GDOUCTF Tea
GDOUCTF Tea分析
sub_140011339
sub_1400112B7
可以看到这是对xtea进行了魔改
1.这里的v6的第一轮先是032×0xF462900,一直到最后一轮是8×0xF46290040×0xF462900,那么逆向写脚本的时候就要从最后一轮一直往前走
2.然后就是这里有一个v6的异或是多的记得填上
3.这里的加密不是两两一组加密完就结束,而是第一个和第二个加密完后,再用第二个与第三个进行加密如此往复
sub_140011352
脚本#include<stdio.h>int decode(unsigned int* a1, unsigned int* a2){ __int64 result; // rax int v3; // [rsp+44h] [rbp+24h] int i; // [rsp+64h] [rbp+44h] unsigned int v5; // [rsp+84h] [rbp+64h] unsigned int v6; // [rsp+C4h] [rbp+A4h] for (i = 8; i >=0; --i) ...