2024春秋杯部分Re-wp+复现
day1
eare
custom_md5_init(seed);会检测断点,我们可以在输入和比较的数据下硬件断点,用写内存的方法把密文写回内存就可以在s1中看到flag。\n
密文:5C 76 4A 78 15 62 05 7C 6B 21 40 66 5B 1A 48 7A\n
1E 46 7F 28 02 75 68 2A 34 0C 4B 1D 3D 2E 6B 7A
17 45 07 75 47 27 39 78 61 0B
ko0h
前面的flag是假的,修一下jzjnz的花指令,可以看到主逻辑
魔改RC4
密文在sub_402A70()里,”DDDDAAAASSSS”
脚本如下
1 |
|
day3
oooooore
全是花指令,大概分为两种,jzjnz和callret,用脚本去花(脚本1),去除花指令后可以看到main中的加密逻辑,看字符串表可以看到一个rc4密钥,还可以定位到输入的位置。
mecpcy那里是密文,s是我们的输入。往下看我们的输入被传入了两个函数中,这应该就是加密函数了。第一个进去就是我们在字符串表看到的那个RC4。
在第二个函数中我们可以在流程图中看到一些常数,按r可以看到他们的字符串”expand 32-byte k”,这个明显就是salsa20或者chacha20加密了,和RC4差不多本质就是一个异或,可以用写内存的方法解决。(其实这些找不到也没什么大问题,下面的动调可以解决一切)
回到main函数,我们在输入的数据下硬件断点,输入一个正确长度的值进行动调,查看我们值的变化。这里我输入flag{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa},继续运行,同时看我们输入数据的变化。
第一次改变在这里,有一个异或,发现数据来源于byte ptr [rcx+rdx]和[rbp-70h],我们在00005555555593BF下断点就可以看到byte ptr [rcx+rdx]是我们的输入,[rbp-70h]是一个地址,指向的地址里面只有一个数据,我们给这个数据下硬件断点继续溯源(其实可以不用再溯源了,这里是为了深入了解)
这次断在这个位置,上面的[rcx]是我们追踪的值,这个值来自byte ptr [rcx+rdx],不过好像被覆盖了,我们下断点查看。里面就是一串表(有点像main函数里面第二个函数上面那些数据),下面还有RC4的密钥,但是不确定是哪个加密函数。取消全部的断点,只保留我们输入数据的硬件断点,继续运行。
最后变化在这个位置,往前看看就能看到只有一个异或,还有一个RC4的盒,那么前面那个就是chacha20或者salsa20。(我们只需要知道加密只有两个异或就行)
再进行一次动调,这次我们把我们把密文作为输入写内存,并在最后一个数据下硬件断点。运行到最后一步加密,再次查看就可以看到flag
1 | 81 ED 7E 2F 93 B6 6F 8D 43 E5 C9 11 A9 F4 2B DB |
脚本1(去花)
1 | import idautils |
easyasm
sub_102C0
1 | seg002:0000 sub_102C0 proc near ; CODE XREF: start+F↓p |
start
1 | seg002:004C public start |
解密脚本
1 | data = [ |