[HGAME 2023 week3]kunmusicin

news/2024/9/21 8:49:43

这道题挺好玩的,坑了我几下,记录一下

题目

下载得到3个文件

 exe打开,不同按钮发出不同声音,除此之外就没有其他东西了

 

exe-Die

exe-IDA

main函数,没有找到“唱”“跳”“篮球”之类的关键字符串

因为爆红,所以动调了一下,也没发现什么东西

 string窗口也没有找到关键词语

 

所以我打算去看看dll文件,在之前做过的题目中,有发现dll中含有程序的关键代码

dll-Die

我看到了NET,后面会用ILSpy或者dnSpy打开

我先拖到IDA中看一眼

dll-IDA

string窗口

看来这个dll就是关键了

dll-dnSpy

发现入口点就是mian函数,直接双击进去

 byte[] data = Resources.data; 可以看出data是一个被调用的资源

下面的异或操作式对资源的解密

那找找资源中的data

右键-->直接保存

根据main函数的解密逻辑,写一个解密脚本

f=open("data",'rb')
f1=open('111','wb')
data=f.read()
for i in data:f1.write(bytes([i^104]))

 得到一个111

111-Die

 是一个PE,又看到了NET

111-ILSpy

这次用ILSpy打开,因为dnSpy打开有点丑,没有ILSpy清晰

 在这个位置,往下翻

 if条件特别多,一看就是要用z3

下面还有一个异或操作

EXP

 这个exp我疯狂踩坑.....

 最初脚本

from z3 import *
s=Solver()
num=[BitVec(('num[%d]'%i),8)for i in range(13)]
s.add(num[0] + 52296 + num[1] - 26211 + num[2] - 11754 + (num[3] ^ 0xA114) + num[4] * 63747 + num[5] - 52714 + num[6] - 10512 + num[7] * 12972 + num[8] + 45505 + num[9] - 21713 + num[10] - 59122 + num[11] - 12840 + (num[12] ^ 0x525F) == 12702282)
s.add(num[0] - 25228 + (num[1] ^ 0x50DB) + (num[2] ^ 0x1FDE) + num[3] - 65307 + num[4] * 30701 + num[5] * 47555 + num[6] - 2557 + (num[7] ^ 0xBF9F) + num[8] - 7992 + (num[9] ^ 0xE079) + (num[10] ^ 0xE052) + num[11] + 13299 + num[12] - 50966 == 9946829)
s.add(num[0] - 64801 + num[1] - 60698 + num[2] - 40853 + num[3] - 54907 + num[4] + 29882 + (num[5] ^ 0x3506) + (num[6] ^ 0x533E) + num[7] + 47366 + num[8] + 41784 + (num[9] ^ 0xD1BA) + num[10] * 58436 + num[11] * 15590 + num[12] + 58225 == 2372055)
s.add(num[0] + 61538 + num[1] - 17121 + num[2] - 58124 + num[3] + 8186 + num[4] + 21253 + num[5] - 38524 + num[6] - 48323 + num[7] - 20556 + num[8] * 56056 + num[9] + 18568 + num[10] + 12995 + (num[11] ^ 0x995C) + num[12] + 25329 == 6732474)
s.add(num[0] - 42567 + num[1] - 17743 + num[2] * 47827 + num[3] - 10246 + (num[4] ^ 0x3F9C) + num[5] + 39390 + num[6] * 11803 + num[7] * 60332 + (num[8] ^ 0x483B) + (num[9] ^ 0x12BB) + num[10] - 25636 + num[11] - 16780 + num[12] - 62345 == 14020739)
s.add(num[0] - 10968 + num[1] - 31780 + (num[2] ^ 0x7C71) + num[3] - 61983 + num[4] * 31048 + num[5] * 20189 + num[6] + 12337 + num[7] * 25945 + (num[8] ^ 0x1B98) + num[9] - 25369 + num[10] - 54893 + num[11] * 59949 + (num[12] ^ 0x3099) == 14434062)
s.add(num[0] + 16689 + num[1] - 10279 + num[2] - 32918 + num[3] - 57155 + num[4] * 26571 + num[5] * 15086 + (num[6] ^ 0x59CA) + (num[7] ^ 0x5B35) + (num[8] ^ 0x3FFD) + (num[9] ^ 0x5A85) + num[10] - 40224 + num[11] + 31751 + num[12] * 8421 == 7433598)
s.add(num[0] + 28740 + num[1] - 64696 + num[2] + 60470 + num[3] - 14752 + (num[4] ^ 0x507) + (num[5] ^ 0x89C8) + num[6] + 49467 + num[7] - 33788 + num[8] + 20606 + (num[9] ^ 0xAF4A) + num[10] * 19764 + num[11] + 48342 + num[12] * 56511 == 7989404)
s.add((num[0] ^ 0x7132) + num[1] + 23120 + num[2] + 22802 + num[3] * 31533 + (num[4] ^ 0x9977) + num[5] - 48576 + (num[6] ^ 0x6F7E) + num[7] - 43265 + num[8] + 22365 + num[9] + 61108 + num[10] * 2823 + num[11] - 30343 + num[12] + 14780 == 3504803)
s.add(num[0] * 22466 + (num[1] ^ 0xDABF) + num[2] - 53658 + (num[3] ^ 0xB838) + (num[4] ^ 0x30DF) + num[5] * 59807 + num[6] + 46242 + num[7] + 3052 + (num[8] ^ 0x62BF) + num[9] + 30202 + num[10] * 22698 + num[11] + 33480 + (num[12] ^ 0x4175) == 11003580)
s.add(num[0] * 57492 + (num[1] ^ 0x346D) + num[2] - 13941 + (num[3] ^ 0xBBDC) + num[4] * 38310 + num[5] + 9884 + num[6] - 45500 + num[7] - 19233 + num[8] + 58274 + num[9] + 36175 + (num[10] ^ 0x4888) + num[11] * 49694 + (num[12] ^ 0x2501) == 25546210)
s.add(num[0] - 23355 + num[1] * 50164 + (num[2] ^ 0x873A) + num[3] + 52703 + num[4] + 36245 + num[5] * 46648 + (num[6] ^ 0x12FA) + (num[7] ^ 0xA376) + num[8] * 27122 + (num[9] ^ 0xA44A) + num[10] * 15676 + num[11] - 31863 + num[12] + 62510 == 11333836)
s.add(num[0] * 30523 + (num[1] ^ 0x1F36) + num[2] + 39058 + num[3] * 57549 + (num[4] ^ 0xD0C0) + num[5] * 4275 + num[6] - 48863 + (num[7] ^ 0xD88C) + (num[8] ^ 0xA40) + (num[9] ^ 0x3554) + num[10] + 62231 + num[11] + 19456 + num[12] - 13195 == 13863722)if s.check() == sat:print(s.model())num[7]=23
num[1]=66
num[11]=131
num[5]=174
num[10]=153
num[9]=239
num[8]=252
num[4]=149
num[6]=218
num[3]=6
num[12]=74
num[2]=160
num[0]=168key=[132, 47, 180, 7, 216, 45, 68, 6, 39, 246,124, 2, 243, 137, 58, 172, 53, 200, 99, 91,83, 13, 171, 80, 108, 235, 179, 58, 176, 28,216, 36, 11, 80, 39, 162, 97, 58, 236, 130,123, 176, 24, 212, 56, 89, 72
]flag=''
for i in range(len(key)):flag += chr((key[i]^num[i%13])&0xFF)print(flag)

运行结果:

以为是我方程少了东西,仔细检查几遍后发现没有问题,一头雾水的卡了

看了其他师傅的wp

发现是我条件不够,这里还要加上下面的条件

s.add(num[0]==ord('h')^key[0])
s.add(num[1]==ord('g')^key[1])
s.add(num[2]==ord('a')^key[2])
s.add(num[3]==ord('m')^key[3])
s.add(num[4]==ord('e')^key[4])
s.add(num[5]==ord('{')^key[5])

这个比赛flag的提交格式是hgame{},要把前面的也约束上

加上约束条件后脚本如下

from z3 import *
key=[132, 47, 180, 7, 216, 45, 68, 6, 39, 246,124, 2, 243, 137, 58, 172, 53, 200, 99, 91,83, 13, 171, 80, 108, 235, 179, 58, 176, 28,216, 36, 11, 80, 39, 162, 97, 58, 236, 130,123, 176, 24, 212, 56, 89, 72
]s=Solver()
num=[BitVec(('num[%d]'%i),8)for i in range(13)]
s.add(num[0] + 52296 + num[1] - 26211 + num[2] - 11754 + (num[3] ^ 0xA114) + num[4] * 63747 + num[5] - 52714 + num[6] - 10512 + num[7] * 12972 + num[8] + 45505 + num[9] - 21713 + num[10] - 59122 + num[11] - 12840 + (num[12] ^ 0x525F) == 12702282)
s.add(num[0] - 25228 + (num[1] ^ 0x50DB) + (num[2] ^ 0x1FDE) + num[3] - 65307 + num[4] * 30701 + num[5] * 47555 + num[6] - 2557 + (num[7] ^ 0xBF9F) + num[8] - 7992 + (num[9] ^ 0xE079) + (num[10] ^ 0xE052) + num[11] + 13299 + num[12] - 50966 == 9946829)
s.add(num[0] - 64801 + num[1] - 60698 + num[2] - 40853 + num[3] - 54907 + num[4] + 29882 + (num[5] ^ 0x3506) + (num[6] ^ 0x533E) + num[7] + 47366 + num[8] + 41784 + (num[9] ^ 0xD1BA) + num[10] * 58436 + num[11] * 15590 + num[12] + 58225 == 2372055)
s.add(num[0] + 61538 + num[1] - 17121 + num[2] - 58124 + num[3] + 8186 + num[4] + 21253 + num[5] - 38524 + num[6] - 48323 + num[7] - 20556 + num[8] * 56056 + num[9] + 18568 + num[10] + 12995 + (num[11] ^ 0x995C) + num[12] + 25329 == 6732474)
s.add(num[0] - 42567 + num[1] - 17743 + num[2] * 47827 + num[3] - 10246 + (num[4] ^ 0x3F9C) + num[5] + 39390 + num[6] * 11803 + num[7] * 60332 + (num[8] ^ 0x483B) + (num[9] ^ 0x12BB) + num[10] - 25636 + num[11] - 16780 + num[12] - 62345 == 14020739)
s.add(num[0] - 10968 + num[1] - 31780 + (num[2] ^ 0x7C71) + num[3] - 61983 + num[4] * 31048 + num[5] * 20189 + num[6] + 12337 + num[7] * 25945 + (num[8] ^ 0x1B98) + num[9] - 25369 + num[10] - 54893 + num[11] * 59949 + (num[12] ^ 0x3099) == 14434062)
s.add(num[0] + 16689 + num[1] - 10279 + num[2] - 32918 + num[3] - 57155 + num[4] * 26571 + num[5] * 15086 + (num[6] ^ 0x59CA) + (num[7] ^ 0x5B35) + (num[8] ^ 0x3FFD) + (num[9] ^ 0x5A85) + num[10] - 40224 + num[11] + 31751 + num[12] * 8421 == 7433598)
s.add(num[0] + 28740 + num[1] - 64696 + num[2] + 60470 + num[3] - 14752 + (num[4] ^ 0x507) + (num[5] ^ 0x89C8) + num[6] + 49467 + num[7] - 33788 + num[8] + 20606 + (num[9] ^ 0xAF4A) + num[10] * 19764 + num[11] + 48342 + num[12] * 56511 == 7989404)
s.add((num[0] ^ 0x7132) + num[1] + 23120 + num[2] + 22802 + num[3] * 31533 + (num[4] ^ 0x9977) + num[5] - 48576 + (num[6] ^ 0x6F7E) + num[7] - 43265 + num[8] + 22365 + num[9] + 61108 + num[10] * 2823 + num[11] - 30343 + num[12] + 14780 == 3504803)
s.add(num[0] * 22466 + (num[1] ^ 0xDABF) + num[2] - 53658 + (num[3] ^ 0xB838) + (num[4] ^ 0x30DF) + num[5] * 59807 + num[6] + 46242 + num[7] + 3052 + (num[8] ^ 0x62BF) + num[9] + 30202 + num[10] * 22698 + num[11] + 33480 + (num[12] ^ 0x4175) == 11003580)
s.add(num[0] * 57492 + (num[1] ^ 0x346D) + num[2] - 13941 + (num[3] ^ 0xBBDC) + num[4] * 38310 + num[5] + 9884 + num[6] - 45500 + num[7] - 19233 + num[8] + 58274 + num[9] + 36175 + (num[10] ^ 0x4888) + num[11] * 49694 + (num[12] ^ 0x2501) == 25546210)
s.add(num[0] - 23355 + num[1] * 50164 + (num[2] ^ 0x873A) + num[3] + 52703 + num[4] + 36245 + num[5] * 46648 + (num[6] ^ 0x12FA) + (num[7] ^ 0xA376) + num[8] * 27122 + (num[9] ^ 0xA44A) + num[10] * 15676 + num[11] - 31863 + num[12] + 62510 == 11333836)
s.add(num[0] * 30523 + (num[1] ^ 0x1F36) + num[2] + 39058 + num[3] * 57549 + (num[4] ^ 0xD0C0) + num[5] * 4275 + num[6] - 48863 + (num[7] ^ 0xD88C) + (num[8] ^ 0xA40) + (num[9] ^ 0x3554) + num[10] + 62231 + num[11] + 19456 + num[12] - 13195 == 13863722)s.add(num[0]==ord('h')^key[0])
s.add(num[1]==ord('g')^key[1])
s.add(num[2]==ord('a')^key[2])
s.add(num[3]==ord('m')^key[3])
s.add(num[4]==ord('e')^key[4])
s.add(num[5]==ord('{')^key[5])if s.check() == sat:print(s.model())num[8]=120
num[11]=93
num[10]=15
num[9]=71
num[12]=133
num[7]=53
num[1]=72
num[3]=106
num[5]=86
num[0]=236
num[6]=190
num[4]=189
num[2]=213flag=''
for i in range(len(key)):flag += chr((key[i]^num[i%13])&0xFF)print(flag)

运行结果:

 乍一看好像没有问题,但是中间有乱码,且提交出错,又卡了一下下

后面发现是 &0xFF 有问题,以往写题约束范围我喜欢用&0xFF

已知ASCII可见字符串的范围是32~127

 0xFF是255>127,还是大于可见字符串的范围

脚本中改成%128就可以了

最终的正确脚本

from z3 import *
key=[132, 47, 180, 7, 216, 45, 68, 6, 39, 246,124, 2, 243, 137, 58, 172, 53, 200, 99, 91,83, 13, 171, 80, 108, 235, 179, 58, 176, 28,216, 36, 11, 80, 39, 162, 97, 58, 236, 130,123, 176, 24, 212, 56, 89, 72
]s=Solver()
num=[BitVec(('num[%d]'%i),8)for i in range(13)]
s.add(num[0] + 52296 + num[1] - 26211 + num[2] - 11754 + (num[3] ^ 0xA114) + num[4] * 63747 + num[5] - 52714 + num[6] - 10512 + num[7] * 12972 + num[8] + 45505 + num[9] - 21713 + num[10] - 59122 + num[11] - 12840 + (num[12] ^ 0x525F) == 12702282)
s.add(num[0] - 25228 + (num[1] ^ 0x50DB) + (num[2] ^ 0x1FDE) + num[3] - 65307 + num[4] * 30701 + num[5] * 47555 + num[6] - 2557 + (num[7] ^ 0xBF9F) + num[8] - 7992 + (num[9] ^ 0xE079) + (num[10] ^ 0xE052) + num[11] + 13299 + num[12] - 50966 == 9946829)
s.add(num[0] - 64801 + num[1] - 60698 + num[2] - 40853 + num[3] - 54907 + num[4] + 29882 + (num[5] ^ 0x3506) + (num[6] ^ 0x533E) + num[7] + 47366 + num[8] + 41784 + (num[9] ^ 0xD1BA) + num[10] * 58436 + num[11] * 15590 + num[12] + 58225 == 2372055)
s.add(num[0] + 61538 + num[1] - 17121 + num[2] - 58124 + num[3] + 8186 + num[4] + 21253 + num[5] - 38524 + num[6] - 48323 + num[7] - 20556 + num[8] * 56056 + num[9] + 18568 + num[10] + 12995 + (num[11] ^ 0x995C) + num[12] + 25329 == 6732474)
s.add(num[0] - 42567 + num[1] - 17743 + num[2] * 47827 + num[3] - 10246 + (num[4] ^ 0x3F9C) + num[5] + 39390 + num[6] * 11803 + num[7] * 60332 + (num[8] ^ 0x483B) + (num[9] ^ 0x12BB) + num[10] - 25636 + num[11] - 16780 + num[12] - 62345 == 14020739)
s.add(num[0] - 10968 + num[1] - 31780 + (num[2] ^ 0x7C71) + num[3] - 61983 + num[4] * 31048 + num[5] * 20189 + num[6] + 12337 + num[7] * 25945 + (num[8] ^ 0x1B98) + num[9] - 25369 + num[10] - 54893 + num[11] * 59949 + (num[12] ^ 0x3099) == 14434062)
s.add(num[0] + 16689 + num[1] - 10279 + num[2] - 32918 + num[3] - 57155 + num[4] * 26571 + num[5] * 15086 + (num[6] ^ 0x59CA) + (num[7] ^ 0x5B35) + (num[8] ^ 0x3FFD) + (num[9] ^ 0x5A85) + num[10] - 40224 + num[11] + 31751 + num[12] * 8421 == 7433598)
s.add(num[0] + 28740 + num[1] - 64696 + num[2] + 60470 + num[3] - 14752 + (num[4] ^ 0x507) + (num[5] ^ 0x89C8) + num[6] + 49467 + num[7] - 33788 + num[8] + 20606 + (num[9] ^ 0xAF4A) + num[10] * 19764 + num[11] + 48342 + num[12] * 56511 == 7989404)
s.add((num[0] ^ 0x7132) + num[1] + 23120 + num[2] + 22802 + num[3] * 31533 + (num[4] ^ 0x9977) + num[5] - 48576 + (num[6] ^ 0x6F7E) + num[7] - 43265 + num[8] + 22365 + num[9] + 61108 + num[10] * 2823 + num[11] - 30343 + num[12] + 14780 == 3504803)
s.add(num[0] * 22466 + (num[1] ^ 0xDABF) + num[2] - 53658 + (num[3] ^ 0xB838) + (num[4] ^ 0x30DF) + num[5] * 59807 + num[6] + 46242 + num[7] + 3052 + (num[8] ^ 0x62BF) + num[9] + 30202 + num[10] * 22698 + num[11] + 33480 + (num[12] ^ 0x4175) == 11003580)
s.add(num[0] * 57492 + (num[1] ^ 0x346D) + num[2] - 13941 + (num[3] ^ 0xBBDC) + num[4] * 38310 + num[5] + 9884 + num[6] - 45500 + num[7] - 19233 + num[8] + 58274 + num[9] + 36175 + (num[10] ^ 0x4888) + num[11] * 49694 + (num[12] ^ 0x2501) == 25546210)
s.add(num[0] - 23355 + num[1] * 50164 + (num[2] ^ 0x873A) + num[3] + 52703 + num[4] + 36245 + num[5] * 46648 + (num[6] ^ 0x12FA) + (num[7] ^ 0xA376) + num[8] * 27122 + (num[9] ^ 0xA44A) + num[10] * 15676 + num[11] - 31863 + num[12] + 62510 == 11333836)
s.add(num[0] * 30523 + (num[1] ^ 0x1F36) + num[2] + 39058 + num[3] * 57549 + (num[4] ^ 0xD0C0) + num[5] * 4275 + num[6] - 48863 + (num[7] ^ 0xD88C) + (num[8] ^ 0xA40) + (num[9] ^ 0x3554) + num[10] + 62231 + num[11] + 19456 + num[12] - 13195 == 13863722)s.add(num[0]==ord('h')^key[0])
s.add(num[1]==ord('g')^key[1])
s.add(num[2]==ord('a')^key[2])
s.add(num[3]==ord('m')^key[3])
s.add(num[4]==ord('e')^key[4])
s.add(num[5]==ord('{')^key[5])if s.check() == sat:print(s.model())num[8]=120
num[11]=93
num[10]=15
num[9]=71
num[12]=133
num[7]=53
num[1]=72
num[3]=106
num[5]=86
num[0]=236
num[6]=190
num[4]=189
num[2]=213flag=''
for i in range(len(key)):flag += chr((key[i]^num[i%13])%128)print(flag)

运行结果:

 flag

hgame{z3_1s_very_u5eful_1n_rever5e_engin3ering}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/46953.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

机器学习--有监督学习--分类算法(KNN算法)

使用场景:做分类的,比如银行想做客户分类,看看新的这个客户,他是高风险用户还是低风险用户。 原理使用:可以用贝叶斯分类,决策树算法,还有KNN,本篇主要整理KNN。 KNN原理:有N个样本点,对新纪录r,使用KNN进行分类,看它属于哪个分类。具体如下: 1、先确定k值,不建议…

Dbeaver执行外部SQL脚本文件创建数据库、建表导入数据等

Dbeaver执行外部SQL脚本文件创建数据库、建表导入数据等点击项目浏览器右键点击选中,然后选择sql文件右键点击连接地址,选中【工具】,选中【创建新任务】填写信息,选中【执行SQL脚本】,然后【下一步】选中脚本文件点击确定选中数据库的连接地址,如果自动关联就无需修改至…

绿色免费离线版JS加密混淆工具 - 支持全景VR加密, 小程序js加密, H5网站加密

自从我们推出在线版的免费JS加密混淆工具以来,受到了广大用户的热烈欢迎。特别是全景开发人员,他们使用该工具加密VR插件的JS代码, 添加域名锁等,都非常有效地保护了插件的代码资源。 最近,我们收到了许多用户的反馈,大家希望能够提供一款桌面版的JS加密混淆工具,以便在离…

nginx四层+七层分享代理实现与tomcat多实例动静分离

实验架构图如下,最终实现负载均衡和动静分离:一、Tomcat 多实例 1.配置思路 1)修改 tomcat 主配置文件 server.xml 中的三个端口号 8080 8005 8009;2)修改 tomcat 启动停止脚本 startup.sh shutdown.sh,添加 export CATALINA BASE CATALINA HONE TOWCAT HOME 变量都指向实…

C# 模式匹配

C# 模式匹配https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/ https://www.codeproject.com/Articles/5368148/Your-Quick-Guide-to-Pattern-Matching-in-Csharp什是模式匹配 模式匹配是一种在代码中识别和提取数据的机制。它允许您以声明式的方式检查对象的形状,而…

Linux 虚拟网络 IPIP

Linux 虚拟网络 IPIPIPIPIPIP隧道是一种点对点的隧道协议,用于在IPv4网络上传输IPv4或IPv6数据包。 IPIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原始IP数据包,并将其传递到目标…

设计模式-策略模式

策略模式 策略模式,又叫政策模式,它是将定义的算法家族分别封装起来,让他们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户,属于行为型模式。 角色:上下文角色(Context):用来操作策略的上下文环境,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变…