normal系列
normal24进入main函数内
其中这个key是取了输入的前4位作为密钥
这个加密挺多位移和或操作的
再下面发现了v27的值为9E3779B9(0-61C88647)
可以判断出是tea系列的xxtea的加密,这样就好解决了
换序
简单异或,数组前三位异或后面的每一位
每一位异或三回
提出比较数据
data=[0xCE, 0xBC, 0x40, 0x6B, 0x7C, 0x3A, 0x95, 0xC0, 0xEF, 0x9B, 0x20, 0x20, 0x91, 0xF7, 0x02, 0x35, 0x23, 0x18, 0x02, 0xC8, 0xE7, 0x56, 0x56, 0xFA]
xxtea加密的key就是flag 4个字
12345678910data=[0xCE, 0xBC, 0x40, 0x6B, 0x7C, 0x3A, 0x95, 0xC0, 0xEF, 0x9B, 0x20, 0x20, 0x91, 0xF7, 0x02, 0x35, 0x23, 0x18, 0x02, 0xC8, 0xE7, 0x56, 0x56, 0xFA]sequen ...
normal系列
normal23这是一个 .Net文件
一般c#和 .Net 都可以用dnspy进行试别和逆向
在其模块(module)中找到main函数入口
here
进入主函数
readline读取输入流,getbytes转化成字符数组
之后输入存放在bytes内,对比用array
对iriszero进行md5加密,转小写,生成key
传入icekey.set 中
set icekey
encrypt
然后和string b 比较(b=”3ACF8D62AAA0B630C4AF43AF327CE129D46F0FEB98D9040F713BE65502A5107A”)
加密好多,先动调试试。似乎最后是在array进行比较,在成功之后还有个decrypt,修改一下array值跳转成功试试
最后查看存储bytes的decrypt结果
我还以为要看加密看到4
normal系列
normal22这题和simple15一样的啊?
再做一遍好了
main函数传参
前面提取文件的部分可以忽略,验证flag的时候需要输入flag.txt
encode逻辑没什么太难的
相当于十六进制转字符串
1234567891011121314151617data=[80, 198, 241, 228, 227, 226, 154, 161, 167 ,222 ,218 ,70 ,171 ,46 ,255 ,219]flag=''for i in range(16): data[i]-=1 a = data[i] >> 4 b = data[i] & 15 if a <= 9: a += 48 else: a += 87 if b <= 9: b += 48 else: b += 87 flag += chr(a) + chr(b)print(flag)
normal系列
normal21重命名
string_hex是字符串转16进制数,
然后进行rc4加密。
最后的值在encode2内进行比较匹配
先动调找出rc4异或的八个值
[0x7C,0xAB,0x2D,0x91,0x2F,0x98,0xED,0xA9]
因为encode2有switch结构
用c会快一点
py用if重构太慢了
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128#include<stdio.h>#include<string.h>bool check(int*a1 ...
normal系列
normal20无壳
像叠叠乐一般的累加
没什么好说的
创建一个暂存量来模拟累加的数字,减回去就行
因为data长65,可以算出密钥长34
123456789101112131415data=[0x72, 0xE9, 0x4D, 0xAC, 0xC1, 0xD0, 0x24, 0x6B, 0xB2, 0xF5, 0xFD, 0x45, 0x49, 0x94, 0xDC, 0x10, 0x10, 0x6B, 0xA3, 0xFB, 0x5C, 0x13, 0x17, 0xE4, 0x67, 0xFE, 0x72, 0xA1, 0xC7, 0x04, 0x2B, 0xC2, 0x9D, 0x3F, 0xA7, 0x6C, 0xE7, 0xD0, 0x90, 0x71, 0x36, 0xB3, 0xAB, 0x67, 0xBF, 0x60, 0x30, 0x3E, 0x78, 0xCD, 0x6D, 0x35, 0xC8, 0x55, 0xFF, 0xC0, 0x95, 0x62, 0xE6, 0xBB, 0x57, 0x34, 0x29, 0x0E, 0x03]k ...
normal系列
normal19无加壳
S@yRtfTl0+ag-L_3M}{ ,这是密码文本,看起来像是打乱
有大量堆积的数据
先用c把他编译成指令
进入之后编译,发现4009a9位置无法编译,而且f12里面检索的到未被引用的文本
应该是加花了,翻一翻花指令的位置
无意义跳转,这种类似offset-offset然后移送寄存器的大部分都是无意义跳转
自我循环
永真跳转
无用花指令实在是太多了,需要些idapy脚本大面积nop
可以用之前用过的PatchByte
也可以用ida_bytes.patch_byte(addr,byte),这个在新版本ida不需要import之前的库
贴个idapy常用api的贴(感谢大佬)
常用IDA脚本开发API | AshenOne (ashenone66.cn)
1234arr = [[0x4009A9,0x4009C7],[0x4009E0,0x4009FE],[0x400ACA,0x400AE8],[0x400B1A,0x400B38],[0x400B65,0x400B92],[0x400BEF,0x400C00]]for i in range(len ...
normal系列
normal 18因为没有users的密钥,谷歌了一下,是BUUCTF的crackMe
题目描述:小张从网上下载到一个黑客软件,然而开发者并不打算共享,所以小张注册了一个用户名叫welcomebeijing,但是密码需要进行逆向计算,请求出密码,进行MD5的32位小写哈希,进行提交。 注意:得到的 flag 请包上 flag{} 提交
整体逻辑
一些函数已经被我重新命名了
进入init看看
类似rc4的s状态向量初始化
success_or_not里面存放的是成功或者失败的状态
而encode里面装的就是rc4的加密了吧
encode内部(上半)
这个是hexstring,转byte,因为要求输入是md5,32位捏
encode下半
encode1是什么捏
进来看看
似乎是个程序启动自检的反调试第一 部分是直接返回值
第二部分是进行异或,不过似乎不影响
compare内部
这个rc4可以不用解,越过反调试直接获取每次sbox异或的值就行
但是直接动调得出的结果不正确
因为有反调试
nop掉跳转就行
然后提取出数据
0x2A, 0xD7, 0x92, 0xE9, 0x53, ...
catf1ag CTF
catf1ag CTFclass12345678910111213141516171819202122232425262728293031323334353637import java.util.ArrayList;import java.util.Scanner;//// Decompiled by Procyon v0.5.36//public class Reverse{ public static void main(final String[] array) { final Scanner scanner = new Scanner(System.in); System.out.println("Please input the flag \uff1a"); final String next = scanner.next(); System.out.println("Your input is \uff1a"); System.out.pr ...
normal系列
normal17
有个upx壳
upx -d 脱壳
进入start函数
此处的CreateMutexW为创建新的互斥体,全局变量 ::hObject获取互斥对象返回的句柄以便调用
此处创建互斥对象的作用就在于防止下面的双线程引起资源冲突,防止数据损坏。
CreateMutexA 函数 (synchapi.h) - Win32 apps |微软文档 (microsoft.com)
进入startaddress
加密方式不繁琐,小写给替换成string中的大写,大写反之。
从第29位开始。这玩意循环30次,但是密码长度只有29,应该是要加东西。
关键在于两个线程的WaitForSingleObject这个函数
WaitForSingleObject function (synchapi.h) - Win32 apps |微软文档 (microsoft.com)
startsaddre是最先开启的线程,而WaitForSingleObject则会让他在sleep 的时候挂起,使其进入等待状态,而ReleaseMutex空出使用权限给其他线程。
从而执行第二个线程的指针递减,等第 ...
b01lers 2022
b01lerscrackme
直接
bctf{133&_letmein_123}
crackme_2
bctf{4lg3br4!}
extreme_64这题是个汇编
nc ctf.b01lers.com 9301
查看服务器端口
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475Warning: _curses.error: setupterm: could not find terminfo databaseTerminal features will not be available. Consider setting TERM variable to your current terminal name (or xterm).Enter a level password or press enter if you don't hav ...