[HDCTF 2023]easy_asm
AMS
直接丢ida
只能看汇编,发现一串16进制数据,再找一下特殊指令,发现一个xor异或
试一下,发现是flag
又看了一下别人的wp:
这里首先取0x00010000的地址赋值给si, 然后给cl赋值0x10
然后使用lodsb读取一个字节到al, 然后让al和cl进行异或操作, 每次执行这个指令后si++
那么现在就很明显了, 就是把从0x00010000之后的字节, 当异或后的结果是$的时候就停止, 也就是当原来结果为0x34的时候停止
感觉没看懂,为什么是这一串,知道的师傅可以说一下吗?
[HDCTF 2023]fake_game
同样是python的exe,解包,很简单的一个题
先z3求出xorr的值,然后异或
from z3 import *
flag = [178868, 188, 56953, 2413, 178874, 131, 56957, 2313, 178867, 156,
56933, 2377, 178832, 202, 56899, 2314, 178830, 167, 56924,
2313, 178830, 167, 56938, 2383, 178822, 217, 56859, 2372]
flagcheck = “”
a,b,c,d = BitVec(‘a b c d’)
s = Solver()
s.add(a * 256 - b / 2 + c * 23 + d / 2 == 47118166)
s.add(a * 252 - b * 366 + c * 23 + d / 2 - 1987 == 46309775)
s.add(a * 6 - b * 88 + c / 2 + d / 2 - 11444 == 1069997)
s.add((a - 652) * 2 - b * 366 + c * 233 + d / 2 - 13333 == 13509025)
s.add(d != 2360)
check = s.check()
print(s.model())
xorr = [178940,248,56890,2361]
for i in range(len(flag)):
flagcheck += chr(flag[i] ^ xorr[i % 4])
print(flagcheck)
不对,看wp,知道解出来的不是2361,而是2360,这是因为z3在Int类型中,会对数据进行一些截断的位操作,这就导致最后的结果有差异,所以这里的话,最好还是使用z3中可以使用位运算的类型,即BitVec.
也可以这样写
from z3 import *
xorr = [BitVec("num[%d]" % i, 32) for i in range(4)]
s = Solver()
s.add(xorr[0] * 256 - xorr[1] / 2 + xorr[2] * 23 + xorr[3] / 2 == 47118166)
s.add(xorr[0] * 252 - xorr[1] * 366 + xorr[2] * 23 + xorr[3] / 2 - 1987 == 46309775)
s.add(xorr[0] * 6 - xorr[1] * 88 + xorr[2] / 2 + xorr[3] / 2 - 11444 == 1069997)
s.add((xorr[0] - 652) * 2 - xorr[1] * 366 + xorr[2] * 233 + xorr[3] / 2 - 13333 == 13509025)
print(s.check())
for i in xorr:
print(s.model()[i].as_long(), end=",")
# 178940,248,56890,2361
enc =[0x2bab4,0xbc,0xde79,0x96d,0x2baba,0x83,0xde7d,0x909,0x2bab3,0x9c,0xde65,0x949,0x2ba90,0xca,0xde43,0x90a,0x2ba8e,0xa7,0xde5c,0x909,0x2ba8e,0xa7,0xde6a,0x94f,0x2ba86,0xd9,0xde1b,0x944]
xorr=[178940,248,56890,2361]
flag = []
for i in range(len(enc)):
flag.append(chr(enc[i] ^ xorr[i%4]))
print(''.join(flag))
# HDCTF{G0Od_pl2y3r_f0r_Pvz!!}
数多的话用下面一个。