[GXYCTF2019]simple CPP

照例利用PE查壳

然后用相应的ida打开程序,找到主函数

 这里做了注释,通过动态调试就可以知道我们的值被传到了memory,这是是flag

这是第一次加密,就是将flag与Dst进行异或

 然后进行了字节叠加,传入v15;

 

然后再传入B数组(为了看起来方便做了更改) ,

我们再把变量进行梳理就很好理解他最后一次加密是怎么回事的了 

 至于Dst的值通过ida动态调试就可以知道准确的值为:

知道了加密方式以及Dst的值最后进行解密

搬师傅的脚本:(x为A[0],y为A[1].........)

# -*- coding:utf-8 -*-

from z3 import *

x,y,z,w=BitVecs('x y z w',64)

s=Solver()

s.add((~x)&z==1176889593874)
s.add(((z&~x)|(x&y)|(z&(~y))|(x&(~y)))^w==4483974543195470111)
s.add(((z&~y)&x|z&((x&y)|y&~x|~(y|x)))==577031497978884115)
s.add(((z&~x)|(x&y)|(z&~y)|(x&~y))==4483974544037412639)
s.add(((z&(~x)) | (x&y) | y & z) == (((~x)& z)|864693332579200012))

s.check()
m = s.model()
for i in m:
    print("%s = 0x%x"%(i,m[i].as_long()))

得到

 结合y的正确值为“e!P0or_a”

opcode =[0x3e,0x3a,0x46,0x05,0x33,0x28,0x6f,0x0d,0x1,0x08,0x48,0x00,0x00,0x80,0x00,0x04,0x8,0x02,0x07,0x17,0x15,0x3e,0x30,0x13,0x32,0x31,0x06,0x00]
x = "i_will_check_is_debug_or_not"
flag = ""
for i in range(len(opcode)-1):
	flag += chr((ord(x[i%27])) ^ opcode[i])
print(flag)
#We1l_D0ne!P0or_algebra_am_i

 参考文章   

 ​​​​​​[GXYCTF2019]simple CPP - LLeaves - 博客园 (cnblogs.com)

        

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值