[GXYCTF2019]simple CPP


[GXYCTF2019]simple CPP

一.查殼

無殼,64位程序

二.IDA分析

找到主函數后動態調試,看的更清楚

經過調試后我們可以找到len就是儲存字符串長度的變量,之后判斷長度是不是大於30,不是的話繼續,然后將輸入的字符串分別與v7中的內容異或,而v7是經過動調發現是

之后再進行一次長度判斷,然后進入一個循環將加密后的字符串進行堆疊,例如字符串原本是A1B2,進行堆疊后儲存到一個整型里就是

0x41314232,然后滿8位儲存一次,最后一次不滿8位的儲存到v8,然后有一個判斷是否動調的語句,修改RIP值進行繞過,后面的邏輯主要是對儲存到v15這個數組中的數進行一些操作,也就是堆疊后的結果進行一些操作,我們可以直接使用z3解方程

腳本來自大師傅(白嫖

# -*- 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()))

然后可以得到

Python>
w = 0x32310600
z = 0x8020717153e3013
y = 0xc0002293008acac
x = 0x3e3a460533286f0d

而幾個解就是儲存到v15數組的值,我們反推,由於解是堆疊出來的 ,我們可以去掉堆疊,還原原本字符串

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

from z3 import *

debug_str = "i_will_check_is_debug_or_not"
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()))
flag=""
li=[]
# 拼接
li.append(hex(m[x].as_long())[2:].rjust(16,"0"))
li.append(hex(m[y].as_long())[2:].rjust(16,"0"))
li.append(hex(m[z].as_long())[2:].rjust(16,"0"))
li.append(hex(m[w].as_long())[2:-2])
print(li)

得到

['3e3a460533286f0dL', '8c008a0978492cacL', '8020717153e3013L', '323106']

最后

Dst = 'i_will_check_is_debug_or_noi_wil'
flag=[0x3E,0x3A,0x46,0x05,0x33,0x28,0x6F,0x0D,0x8C,0x00,0x8A,0x09,0x78,0x49,0x2C,0xAC,0x08,0x02,0x07,0x17,0x15,0x3E,0x30,0x13,0x32,0x31,0x06]
s=''
for i in range(len(flag)):
    s+=chr(ord(Dst[i]) ^ flag[i])
print(s)

這個時候發現結果

We1l_D0n�e�b' _�lgebra_am_i

似乎不對,找到原因是方程不止一個解,而比賽的時候給出了第二部分的結果e!P0or_a

最終得到

We1l_D0ne!P0or_algebra_am_i


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM