解出来两题,别的题目等有空再复现

reverse

easyre

re签到题,首先是查壳,AS壳,脱壳动调不起来。

ASpack脱壳

赛后学习一下如何脱壳:

第一步,运行pushad这个指令,然后发现之后esp改变了,这时候可以使用ESP定律了

第二步,在改变的esp处,右键,数据窗口跟随

第三步,下硬件断点无论选择多少个字节,只要第一个字节是esp所指向的就行,然后下硬件断点,随便是什么大小都行

第四步,F9+数次F8,遇到一个retn大跳转,跳转到奇怪的地方,右键分析,从模块中删除分析

第五步,删除断点

第六步,右键选择od脱壳插件,点击脱壳,选择地方保存即可。可以选择重建或者不重建输入表,都可以试一试。

题解

用die查看还能查看到壳

但是用exeinfope查看,已经识别不出来了

放入ida中反汇编,上面那么多的函数,只有最后一个是对输入的字符串进行转换,跟进

动调后发现,真正有效的,只有最后的异或,Str是input,与dword_492940数组异或之后,与v2数组对比

输入符合条件的字符(或者直接头铁修改汇编/flag寄存器可以)

跟进最后的sub_401771函数(tab键切换显示)

只需要在此处下断点,然后f9键,重复循环,记录下eax(注意是低位,也就是最后两位的值,伪代码界面中已规定)的值,也就动调出了dword_492940数组的值

我用x32dbg,

下面是脚本:

1
2
3
4
5
6
7
arr = [0x38,0x78,0x0D,0xE8,0x0,0xAF,0xBF,0x3A,0x6B,0xFB,0xB8,0x0c,0x85,0x35,0x5c,0xAD,0xE6,0x0,0xE0,0x8A,0x1D,0xBD,0x46,0xD2,0x2B,0x0,0x15,0x24,0xc6,0xad,0xa1,0xc9,0x7b,0x12,0x28,0x0,0x5,0x0,0x72,0x3e,0x10,0xa1]
v2 = [-61,-128,-43,-14,-101,-48,11,-76,85,-34,34,-125,47,-105,-72,32,29,116,-47,1,115,26,-78,-56,-59,116,-64,91,-9,15,-45,1,85,-78,-92,-82,123,-84,92,86,-68,35]
flag = []
for i in range(len(arr)):
flag.append((v2[i]-71)^arr[i])
for i in flag:
print(chr(i%128),end = "")

DACT&{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}

crypto

FlowerCipher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# python
from md5 import *

#from secret import flag
import random

flag = b'flag{%s}' % md5("hello").hexdigest()
# note that md5 only have characters 'abcdef' and digits
print(flag)
def Flower(x, key):
flower = random.randint(0, 4096)
return x * (key ** 3 + flower)

flag = flag[5:-1]
rounds = len(flag)

L, R = 1, 0
for i in range(rounds):
L, R = R + Flower(L, flag[i]), L

print(L, R)
'''
L = 15720197268945348388429429351303006925387388927292304717594511259390194100850889852747653387197205392431053069043632340374252629529419776874410817927770922310808632581666181899
R = 139721425176294317602347104909475448503147767726747922243703132013053043430193232376860554749633894589164137720010858254771905261753520854314908256431590570426632742469003
'''

就是找规律

我用的是字符串“hello”的md5值进行测试的,顺带输出了随机数flower的值

截取flag括住的md5字符串,将每位的md5字符的ascii码值的三次方,与随机数flower相加后,x对其进行相乘的轮运算。

我这边就不分什么L和R了,同一就L吧

L的值经过运行,会共有33个结果,我只列出5个(别忘了R的初始值为0,得算上)

1
0,1,152499,15285066269521934987200861169……

首先是从1得到111582这个值,

1 * (ord(“5”) ** 3 + 3622(随机数) ) + 0 == 152499

152499 * (ord(“d”) ** 3 + 2306(随机数) ) + 1 == 152850662695

152850662695 * (ord(“4”) ** 3 + 2898(随机数)) + 152499 == 21934987200861169

……

有个细节就是关于md5,ascii码的爆破,只有16个值,我们将其的三次方统计出来,然后再带入,就能避免爆破时的重复运算。

我的代码只有两段,总体来说有以下几个步骤:

  1. 把题目给出的L和R放入第一段代码中爆破,找出与Ln最相近(至少头5位以上相同)的那个数L
  2. 记录L的值,再将Ln和L放到第二段代码中算出(Ln-L)
  3. 颠倒次序,把Rn的值放入Ln,把(Ln-L)放入Rn
  4. 下一轮爆破
1
2
3
4
5
6
7
8
9
Ln = 15720197268945348388429429351303006925387388927292304717594511259390194100850889852747653387197205392431053069043632340374252629529419776874410817927770922310808632581666181899 
Rn = 139721425176294317602347104909475448503147767726747922243703132013053043430193232376860554749633894589164137720010858254771905261753520854314908256431590570426632742469003

table = [110592, 117649, 125000, 132651, 140608, 148877, 157464, 166375, 175616, 185193, 912673, 941192, 970299, 1000000, 1030301, 1061208]
arr = "0123456789abcdef"
for k in range(len(table)):
for i in range(4097):
s = Rn * (table[k]+i)
print(s,i,k)
1
2
3
L = XX
L2 = XX
print(L1-L2)

以下是我记录的结果,也顺便把flower随机数给求出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#   15720197268010049967757675120469992186537658494704135479561283085920610969374470767952957875436059114121446299016141673102641832905150384839824642839374686669270876487929996533 1919 0
# 139721425168891349281451572792544680133048837962069857150100615261867817820225178415462359077837226554096748311704122075309731667870724937930248453782400769574967523270642 510 5
# 935298420630262423185150206646668885399191421990835568861492588788973905537009439370462836218449045234881355649430474024746318871954304126501288629400235458740127101 1341 2
# 7402968320531989835670241249457421938283688514175514626293968883156349035945739737904361257497353379629413158206906713676778417021296445905576431695996715641300 2804 8
# 41491807644826481333056571242042987763162606518088912744473506551739700646996757137623352025000231061906119571673189237339386631862081048474757647974486052 3540 0
# 363542281257405436738062356377499261443865043865819271011660681964779781594783648490405407084091956921600660152274552384722839809777207315962395724219 2014 1
# 3038050869988262429655157757050855487684960921705258160397820501320186928458237610126810889102968352283119686135758844661757227858541497892329978 2910 12
# 3121683903427741450531538690298173116055843159376206844245035131620220173908400102678527763657957532736559255674205238569272853603347684360 1583 9
# 16713517279651699427416237029968408926588205411468552569137856325095699110951088692439450366166993887875519154383257203446616180663090 1553 11
# 17728566345759946219419043899895158573935956749824781372783616735461960720379964461326804126448830581009804233228809205290722005 677 11
# 18822751726345982203536113956628287336349341818556411576055283361468981935791538263907057292686428250726627439749346855794 2623 12
# 19346619488846194559561002486970415604137588112233495035918509580946584549555534897772973203882140940841422311351882 2182 13
# 19304497076062675076996611100676013925228610670849154654479793346504090311378449485002713890157750241704060905 899 13
# 19287157920117788313343479701196130159642868618931955510796952126270844726755147453674899267075236180510 536 1
# 163194634847106630304640801569246968479812515049711601031768905677844430993957504882527310932658385 1206 7
# 973825402916378169077745443044681608822639561953870686694312206745163458824521668260965989574 4070 6
# 6028609474854126199515278609291926142756502224800248232787857670670545743680405264374000 3699 14
# 5830376667896185002654420350650782884309207250500677414733204240590442735335736536 2360 8
# 32759342090244825649040695774567282547692783729977476494686456263546407645500 3129 3
# 241267801517462008306176189488648150382335625618648940556475948111371047 3927 13
# 240324048965397603464474529360761469453780103694211768036773812736 2623 6
# 1501209023616087621185251887472189877470525030158230860929775 2967 2
# 11731219952133874353623065586006692045981599038444975155 427 15
# 11050144307659161397338047811281198461104120235200 259 14
# 10722465753785810850086192105446537156391682 330 6
# 67952303343060595219909806911058324892 2545 6
# 424678007753497956261063331068660 3868 11
# 449366185988738790777629544 398 7
# 2694478038806093981253 217 0
# 24316418691544200 1240 8
# 137492755074 1021 14
# 133317 666 3

flag就出来了

1
2
3
4
arr = "0123456789abcdef"
flag = [3,14,8,0,7,11,6,6,14,15,2,6,13,3,8,14,6,7,1,13,13,12,11,11,9,12,1,0,8,2,5,0]
for i in flag:
print(arr[i],end = "")

DASCTF{3e807b66ef26d38e671ddcbb9c108250}