前言
把22年寒假的WP转移到blog上,这次是逆向进阶专题的,原题链接在最底下。
MFC
先用die打开,无壳pe32,用ida32打开,找不到main函数,因为程序用了MFC库,找字符串也没发现明显的函数,打开程序,点按钮会弹出消息框,查询资料分析可以查找调用消息框的函数,找到了两个关键函数
点开两个分别看看函数,大概意思是都是将一段数据与一个数异或,然后输出到消息框上
数据不长,应该是注册码判断的消息,两个函数都是同一代码调用的
调用来源于一段代码,应该是ida分析错误,选中代码按P生成函数,这个函数应该就是注册码判断函数点开函数看看,可见注册码应该长33个字符,然后通过一个比较函数进行判断,最终给出结果
点开比较函数,是生成随机数对注册码进行比较
查询资料知,种子固定的情况下srand和rand是伪随机,把代码复制粘贴运行得到每一次的随机结果都是1
那么注册码就是this+96+1位置处的每隔10的长度为33的字符串
之前看字符串表的时候发现过一个可以的超长字符串,找到调用它的函数
这个字符串被拷贝到了this+96的位置,那么flag就在这个字符串里面
得到flag的代码如下
#include <stdio.h>
int main()
{
char buf[1024] = ";f1K3{c5:efl21t4;1t1zaxpim9}5+?gtux;=vc9v{v7+buhU{bT=-am2q}=fh[xk{y?xrqe{?}l5-sd2-Mo+:j{9=sY[dalvpx?z3{?no{[k5ll{zjsu5[kfla+r6Zg72o0skq6cGl5cw[=d?3v9q5-vkjSv{4sqtg=f0cz{+jurjfl[tb]lrfF1;2}udhb?0g8{om:T4dh;z:oz-Dn=m=ux;o[gs9{+zqx+sq-dsxctcvykUs2oddrt43pwv:f0;njkrb9los6g0{ih?rqantfx$sslqd:rvqixr;j{?o:sn+[i[yA11;gsmr8lm0?3};+iv+Tf:4Gtv2:-20upi0]7?77=;qzx{m-W;0vtueh]ko8d?=w:fbhd{E:;19?p=k:b+}doht6wpEq-z]2qbV1}dh416qw9:xm[;ed;:ecb-0:ni-s4u2kf6]2wn45amzjrun=ofkx-=hmgo-lz;j909=rmo7xcj4le0hxs[i]-vjl[?o12:sv4upio7ma1hRy7556+57krev:hLQ+1cx65z5v5];6n=[p83;n={zm{k2p";
char flag[35];
for (int i = 0; i < 33; i++)
{
flag[i] = buf[i * 10 + 1];
printf("%c", flag[i]);
}
return 0;
}
flag为flag{The-Y3ll0w-turb4ns-Upri$ing}
验证通过
压缩包里的还有一个文件,用记事本打开,学习了一下,发现应该是ollydbg的一个常见插件ollyscript的脚本语言,阅读文档知,这段脚本一个是中断在cmp命令处,即中断在比较flag和输入注册码的地方,然后把flag放入flag_mem处,最后在消息框输出flag
尝试了一下,脚本成功运行,也得到了flag
new
先用die打开,无壳pe64,用ida64打开,查看main函数没什么思路,经过指导后知道程序是用pyinstaller打包的,学习后了解到通过程序的图标和程序中的字符串也可以看出来python的痕迹
运用pyinstxtractor.py提取出pyc文件,提示失败了,经过学习知道可能是程序在末尾处进行了混淆,用010editor删掉末尾处4个字节的数据,另存为后再次提取成功
打开提取后的文件夹,找到打包前的文件CM,加上pyc的后缀
学习后知在打包成exe时会抹去pyc开头的部分信息,需要修复,而修复的信息可以在struct文件中找到
pyc文件缺了E3之前16字节的数据,补上后,使用uncompyle6反编译得到CM.py
阅读代码后发现程序引入了两个自写的包,分别是CMpub和general,在PYZ开头的文件夹找到它们,也修复后反编译出来
阅读代码后得知序列号经过10次RSA运算,而用户名的sha256值是运算顺序,得到序列号需要解10次RSA
经过学习和借鉴,最终代码如下
from Crypto.Util.number import bytes_to_long
from hashlib import sha256
d_list = [0, 1229061379053482744823152709690434888605435342198642793057361495153090878523561729157374272032362247153476832905266577597936263875922635915871109425948662301015976854125739243408750974498511602088546684816889116185016023460221241669, 777757116197429014363243483536399809327489478672765799132008796613164652485176625704586327714092043960999487185568710834915265226900792279774759093092549483626423808502139519027474793822444064402879491357824424416255246538629615833, 823517544270505260875748293850542665969704501523967290816451493771583601768953397655610971102989198539746963950912153425409736040224095605717482218948794082459357645210952999432155985335398508720958815348576453854403675948095665769, 201419093613711761798540120588879041236840801068737686325195769604622639638393093247553615834885873886104026065263583851481439063609372020322699902282368593094548575688163522138303256348801329176798576662806247524508598547117027909,
0, 922636550562204599680939922372659456090989853033213781402035071733018496656291847983487357218691366381484789513851952285401356211108779700672241308549478980097499945532484886375918716118514969665502334756552044884230174523807259329, 627567627354326605515830278366021138159090868181225778581524414114680017539982571880336309158282300554534438008003322761037932916796881232969829716072515736525821134512405811777096389132413642826921797756179543381108933388795804769, 87763698610259057934268676955169084425464093902524300758830437447338976666426976224860384022223934601405128988601223084334832120115000652985202766336425151725676233383146800117094745887838499800523801384784235875984207816521259103, 476133969086427941368462698171675198835788633664060460402567958612344234273279077792246479357026462298849835811290909092037603283477920353500979549470973082158764663458247740861805650589884280458476962517272738918503674157481390819]
now0_d = [3278088227273880484685188900446423165326324359156241482897, 5595268830569065289149075246423557309146176813871482913465,
5168422726700129702446055556002687483861807983023239862033, 935387432279493795970516178982877288303534264234974679937,]
now0_n = [6277052177355867862708971469565390229110991711310599757597, 6277031389885428580574088212602983156224270664268963309877,
6277087998938792861042405062580257456598525084583043892593, 4973828634074084070222279013150769733596223651485114564273,]
pub_n_list = [1230179032923966355216193664456989083993912178939747632284136330115404600706909248395341278324517175820853286404743710145952644302282044037365125019184623573863075946389644423629304167773956447181872440665027369039751736977631813405, 1230197346433601576871359147146318345794660644587556813317361121112259736906064757424819981626600536503633922734399282271582600808051530362336101942259823441839299355603967188517947938968081105138847731565260537550727639211683197879, 1230175103148238074642625667635930176506433011031372989302833308622794392947506662903737049730958209740476679577696669046125817578949235076594181707520951908118478466754559490593457625240572006099913042624607335165510041897534435209, 1230195419889872144876656964938566328205499234259210834822623032535100815525647028091967713768075507813160118981470260555950945392043292242406398016007295386079663975352275199434079009613722639414793342879897781273997830701207001839, 1230174827420484335136670743465041112031290639257519417607166302989196920558878232997045073571925815302061150702941267642751824310540753494973942944709182841639107639574372312103384805313053886702823094137071927771880443876497834223,
1230185988420782350445684618408731075592594374149632568516959143947765502111474165779039038375448460747737995123102271976521803891348006321134167925739699715318653372703575221067707929872597815216923462345784043188962130180912008349, 1230182067416272799574586563163545941454653137377618375202713428977357995541722463977983142958255155175313052685136009571171283284447072364958073918526788611457558644331357136872625495927467161960356807765452292242153097362794537297, 1230175667673121302771605367336364266247327534138626737357715728447532125946735363769285915448580252805827932111511713836998047583507066247536863749820566853793525683889378074234787827092004094825431802398656705570322640700888234457, 1230196215847264556140155304337951587143228841840811940425256504477922246092127337047231112435502675187836322205816125340569108923142351137471846665258392302281836567949024626839375922984390501852966755563575130612920367863203222919, 1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413]
pub_e_list = [516522834974778788822737622050071002228140433403308439492366176194856535110473049678585760137133115927927751389873437178270126066640141239601219481836725664034890696476089482771855782560150644578106217444113872365843767702019835165, 763019398230639020385095590111745749325105506404934257293148841704076883985487416392986296273940405033341623636375465706381388882972769884442281412068657916633528090146878551371406807944205178239005601520958614234641039656871416589, 758988267473789691400810521950661631157749425185051374867090671651749645717430551141709267885532654476900928589359256799354189000242807872593092025777838259738748452497031844208902096380110211365512236965688511597330444132995706089, 1160624249765899561934599801255171381291816170997589163041066264243942985094428544791715385847964978883555709070528078257993944356365754193784103706700609561770247555832359683008614876192584738534198649251915489100192910235497240729, 969584864618350548573879514405798110739020997255786147754353418263140741786718203172013471748696400657712445258494301947449205093259143099235572291402265831321039275001497928579686310419303799571460516007736804962510266314260484877,
977635869919691501956476862485989771461480520535754082824505449124021204549179419508424215127475063873127952064971338143136691515421466871627243381628988777601672460858098249144471775030169367579800220246847826510445608881346258241, 78547544255936347746865903259860321812178052069796003154571672431430356709336862994676369608681727972743046653319757142976388460246409300441314120923213061705641045744824531268088986356203751782848608006264879618324460588039470689, 917852167599983949701460374746950168138446186550074700858636881546192542929330983597633909534315139846805451671216776221152853388795036676315895948093016056124384137235869660229554239964598066970045657946753074761366723500887474273, 512767915836808239407587704603826045022417741229198687031456060058182528147222248648359114235863620155721720617193551963387219761946115199232261616095015003006138489919312964841684835736418589367746436759162173805823822810793395319, 1528664914065178933673821962753205462549978186396819666317790993639228285768444490202530533489915241541000489357324333513953018274712260336841857865516134868397620862505815431605074038377372062941322744934135683316080403207986149067]
def gen_code(name, seq):
now = name
for j in range(len(seq) - 1, -1, -1):
i = seq[j]
n = pub_n_list[i]
d = d_list[i]
e = pub_e_list[i]
if now > pub_n_list[i]:
return False
if i == 5:
for _ in range(972):
now = pow(now, e, n)
elif i > 0:
now = pow(now, d, n)
else:
now = dec0(now, e, n)
return now
def dec0(m, e, n):
nbit = 192
T = (n.bit_length() - 1) // nbit + 1
ans = 0
for i in range(T - 1, -1, -1):
def xxx(x, t):
return x >> t * nbit & (1 << nbit) - 1
now_m = xxx(m, i)
ans = (ans << nbit) + pow(now_m, now0_d[i], now0_n[i])
return ans
def get_enc_seq(username):
h = sha256()
h.update(username)
hash_value = int(h.hexdigest(), 16)
T = 9
S = 10
stat = [0] * (T + 1)
seq = [0]
n = hash_value
while n > 0:
if S * T > len(seq):
now = n % T + 1
if stat[now] < S:
seq.append(now)
stat[now] += 1
n //= T
return seq
def enc0(m, e, n):
nbit = 192
T = (n.bit_length() - 1) // nbit + 1
ans = 0
for i in range(T - 1, -1, -1):
def xxx(x, t):
return x >> t * nbit & (1 << nbit) - 1
now_n = xxx(n, i)
now_e = xxx(e, i)
now_m = xxx(m, i)
if now_m >= now_n:
return 0
ans = (ans << nbit) + pow(now_m, now_e, now_n)
return ans
def check(serial, seq):
now = serial
for j in range(len(seq)):
i = seq[j]
n = pub_n_list[i]
e = pub_e_list[i]
if now > pub_n_list[i]:
return False
if i > 0:
now = pow(now, e, n)
else:
now = enc0(now, e, n)
if 0 == now:
return False
return now
def main():
username0 = 'NWPU'
username = username0.encode('utf-8')
seq = get_enc_seq(username)
username = bytes_to_long(username)
serial = gen_code(username, seq)
check_value = check(serial, seq)
if check_value == username:
print(hex(serial)[2:].upper())
if __name__ == '__main__':
main()
其中username0可以任意替换
选取username=NWPU
对应serial=43AC233771B4B122D47F2112695691581FC62CE0AB7720DC63AECB3B1701DB4384C07B9CB2242E792A236C797905543C77C92C5DB05ED916D12E8002E489EA169D2B6CDFCBB946CE8B1C9A777906A111087E69C289185AEEC7F9D8F23C904446
最后验证通过