2019xman个人晋级赛之little-unpack

逆向题有点坑,这道看到后边时间有点紧,看不下去,有点可惜。

题目

re2.rar

(5.66 KB, 下载次数: 0)

2019-8-14 11:36 上传
点击文件名下载附件

一打开数据混乱,应该是加壳了。

直接在seg022段下断点,动态调试。
运行如下代码段。
[Asm] 纯文本查看 复制代码

seg024:000000000060309D cmp     rax, rcx
seg024:00000000006030A0 jnz     short near ptr loc_6030A4+1
seg024:00000000006030A2 jz      short near ptr loc_6030A4+1

发现解密循环判断,判断是否解密完。rax是段的起始地址,也就是0x400850,rcx代表段尾。

解密完之后进入代码段之间还有一个反调试。
[Asm] 纯文本查看 复制代码

libc_2.24.so:00007FBF48D4E344 mov     [rdx], eax
libc_2.24.so:00007FBF48D4E346 jz      short loc_7FBF48D4E354
libc_2.24.so:00007FBF48D4E348 xor     edx, edx
libc_2.24.so:00007FBF48D4E34A xor     esi, esi
libc_2.24.so:00007FBF48D4E34C mov     rdi, r9
libc_2.24.so:00007FBF48D4E34F call    near ptr __cxa_atexit

手动修改寄存器的值跳过。

进入核心段之后发现

造成这种原因为因为代码段中插入了很多0xE8数据,手段修改,得到。

虽然还有很多花指令在其中,但已经不影响阅读。

其中还有一些反调试,可以手动去掉、

程序大概流程是输入明文,经过des加密对比、

这是key的赋值
[Asm] 纯文本查看 复制代码

.text:00000000004009FC mov     qword ptr [rsp+28h], 0
.text:0000000000400A05 mov     byte ptr [rsp+20h], 31h
.text:0000000000400A0A mov     byte ptr [rsp+21h], 32h
.text:0000000000400A0F mov     byte ptr [rsp+22h], 33h
.text:0000000000400A14 mov     byte ptr [rsp+23h], 34h
.text:0000000000400A19 mov     byte ptr [rsp+24h], 35h
.text:0000000000400A1E mov     byte ptr [rsp+25h], 36h
.text:0000000000400A23 mov     byte ptr [rsp+26h], 37h
.text:0000000000400A28 mov     byte ptr [rsp+27h], 38h

即key=12345678

加密后,密文的对比方式
[Asm] 纯文本查看 复制代码

.text:0000000000400BE5 loc_400BE5:                             ; CODE XREF: .text:0000000000400BDF↑j
.text:0000000000400BE5 pop     rax
.text:0000000000400BE6 pop     rax
.text:0000000000400BE7 mov     edx, [rsp+0E0h]
.text:0000000000400BEE mov     eax, [rsp+0E4h]
.text:0000000000400BF5 mov     ecx, edx
.text:0000000000400BF7 sub     ecx, eax
.text:0000000000400BF9 cmp     ecx, 55F8FD5Bh
.text:0000000000400BFF jz      loc_400CA6


.text:0000000000400CA6 loc_400CA6:                             ; CODE XREF: .text:0000000000400BFF↑j
.text:0000000000400CA6 mov     ecx, [rsp+0E8h]
.text:0000000000400CAD mov     esi, [rsp+0ECh]
.text:0000000000400CB4 mov     edi, ecx
.text:0000000000400CB6 sub     edi, esi
.text:0000000000400CB8 cmp     edi, 3C763966h
.text:0000000000400CBE jnz     loc_400C05
.text:0000000000400CC4 imul    rax, rcx
.text:0000000000400CC8 mov     rcx, 13069E5EF81C51D0h
.text:0000000000400CD2 cmp     rax, rcx
.text:0000000000400CD5 jnz     loc_400C05
.text:0000000000400CDB imul    rdx, rsi
.text:0000000000400CDF mov     rax, 16DE11EA08E740B7h
.text:0000000000400CE9 cmp     rdx, rax
.text:0000000000400CEC jnz     loc_400C05
.text:0000000000400CF2 jnz     short near ptr loc_400CF6+1
.text:0000000000400CF4 jz      short near ptr loc_400CF6+1

[Asm] 纯文本查看 复制代码

one - tow = 0x55F8FD5B
three - four = 0x3C763966

tow * three = 0x13069E5EF81C51D0
one * four = 0x16DE11EA08E740B7

直接写脚本解
[Asm] 纯文本查看 复制代码

from z3 import *


x = Solver()

flag = [BitVec('flag%d'%i,64) for i in range(4)]

x.add(flag[0]>0)

x.add(flag[1]>0)

x.add(flag[2]>0)

x.add(flag[3]>0)


x.add(flag[0]-flag[1]==0x55F8FD5B)

x.add(flag[2]-flag[3]==0x3C763966)

x.add((flag[1]*flag[2])==0x13069E5EF81C51D0)

x.add((flag[0]*flag[3])==0x16DE11EA08E740B7)

print x.check()

print x.model()

得到
[Asm] 纯文本查看 复制代码

[flag1 = 780944752,
 flag3 = 741130309,
 flag0 = 2223325899,
 flag2 = 1755511211]

根据大端小端,得到密文
cb42858470458c2eabf9a26845c02c2c

此时还是解不开。后面发现是字秘钥处理方式被改了。

就是生成16组字秘钥之后,再将每一组以64位操作下循环左移5位。

在标准的des代码中加入
[Asm] 纯文本查看 复制代码

	for (count = 0; count < 16; count++)
	{
		temps = sub_key[count];
		//sub_key[count] = ((temps << 5) & 0xffffffff) | ((temps >> 59) & 0xffffffff);
		sub_key[count] = (temps << 5);
	}

运行得flag

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
管埋员的头像-小北的自留地

昵称

取消
昵称