HDCTF之RE题

[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!!}

数多的话用下面一个。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值