BCTF也过去两周了,本来这个writeup也已经公开了,但是总想借个地方说点什么。就借FreeBuf宝地写的笔者自己的看法吧。

搭车做Light 4 Freedom的广告。~_~

Light 4 Freedom 其实成立也有一段时间了,但是其实大家也只是玩玩而已,一群对安全感兴趣的人聚在一起。谈天说地,扯淡吹牛。自由之光本是一位名为FO[天国之翼]的屌丝长发学姐将一群人拉到了一起,组一个团队想一起做点事情,只要是安全方面的都ok,不局限于二进制或者web类,后来各位大牛都开始工作了便也没有一起做什么事情了,其中包括一位最近挺火的锅炉工学长~_~。到了今年,笔者有幸得知各位给力的合拍的队友们都想要一起玩玩ctf,做点安全研究,此乃笔者之大幸~各位队友,么么哒~

介绍下我们的几位给力的队友:

稻草人[dc2014]:一位摧残祖国花朵的老湿,各方面都有涉略。
二壕[Mr_Half]:一个可爱的高中男生呢,以土豪闻名于队,高富帅。
Wins0n:winson。代码疯子。二进制安全方面的高人~他的一篇文章广为流传来着(笔者和某人在武汉偷偷议论winson。。因为他就坐我后面,没想到成了我队友,缘分啊)
leelour:CU神牛么么哒,但是这次暂时在别的队伍,但是他是爱我们的。
nGod :北大的亲,这次bctf由于计较忙所以就没参赛了。
毛毛[xi4o]:北邮研究僧,二进制安全方面做的赞~目前研究安卓安全较多
史先生[Puzzor]: 特别屌的一个人,认识的都懂,不认识的就算了。(也是笔者和某人在武汉还偷偷议论他,没想到也成了我的队友,还真是无巧不成书)
TedJoy:已经在职工作,溢出牛一枚,在溢出方面做的真是赞~很有想法
西瓜皮[howmp]: 和ls的仁兄有说不清道不明的关系。。帅哥一枚,逆向牛一枚。网上还有个id:z8
笔者[EvilMoon]:小屌丝一枚。

================分割线================

其实借FreeBuf只是想谈谈对CTF的一些拙见。

一直以来我都觉得CTF只是一场和队友们一起战斗的游戏,头脑风暴,诚然这类ctf从目前看来实战的意义也许不大,但是在我看来更多的是一种眼界的拓展,更是一种启发,也是一种对自身技术的重新测,以前渗透一些东西,也许我用了一些技术,可以绕过很多其他的技能而不去实践,只是想当然,而到了ctf上这个坎你就是迈不过去,必须重新实践一遍,是一种挑战也是重新学习,ctf对于我的意义则是享受和队友们一起日夜奋斗的感觉,以及明了要对自己的技术负责。

在真实的渗透中可能不需要用到那么多技术,更多的只需要一个思路,将目标撕开一个口子,拿到想要的东西即可,但是ctf更能凝聚我们这些小伙伴。并且吸引一些新人入行,不至于青黄不接,也带领新人走一条正统点的路,别都成了雇佣兵了。另,前段各个大神都在说ctf没有现实意义,本来我是想说其实国内不止bctf,还有西电的,杭电的,北理工的,个人觉得西电的就很贴近实际战斗的东西。但是在我看来实际问题在于:ctf受制于时间,只能比拼一些方法论,比拼速度,这是他自身的必然,是优点也是他脱离实际的方面。实际的渗透更需要的是潜伏。可能一个系统目前没问题,但是盯的时间久了总会有出问题的时候,这就属于不怕贼偷就怕贼惦记=。=~然天下武功,无坚不摧,唯快不破。ctf比拼的速度也是一种特殊技能,对于渗透来说经验的多少直接导致渗透的成功与否和快慢。并且渗透中,突破口有时候总会在一些想不到的地方,所以该让脑子转起来~

所以,总结我玩ctf的目的:

一、小伙伴们一起玩着爽。
二、吸引新人入行,感受下安全的一些基本的东西。
三、头脑风暴下,发散下思维。
四、锻炼下渗透的速度。
五、重新审视一遍自己的技能熟练度。

今后我们几个小伙伴也不一定一直参加各种ctf,但是一定先练内功,希望能做出一些让大家眼前一亮的东西。:-)

夜半随心乱写,烂文一篇。还请各位大牛在评论里轻喷,有什么好的建议我们定当虚心接受。

最后感谢有爱的嘎巴嘎巴小编帮忙排版~

0×01    初来乍到[100]

[因为这题实在没什么好写,官方骗粉可耻~_~.就是关注下看下公司]

===================Light_4_Freedom=================

0×02    内网探险[200]    From    Puzzor

通过分析拿到的数据包,可以发现在 218.2.197.236 开启了 DNS 服务。使用 UDP 53 端口。

而通过端口扫描发现其开启了 TCP 53 端口

内网探险[200]    From    Puzzor

于是想到利用 TCP DNS 的请求方式。于是利用 TCP DNS 向 218.2.197.236 发送 DNS 请求,得

到结果如下:

内网探险[200]    From    Puzzor

输入后得到 Key:

内网探险[200]    From    Puzzor

===================Light_4_Freedom=================

0×03    诱捕陷阱[300]    From    Wins0n

最初给的数据时 dionaea 蜜罐,本来就想到了攻击数据的回放,于是就安装dionaea 蜜罐(http://dionaea.carnivore.it/#compiling),这个过程比较费时间,而且最开始在 Ubuntu 上由于 OpenSSL 组件安装失败导致无法链接 dionaea程序。后来换到 BackTrack 上重新安装,终于装好了。

使用 dionaea 自带的 retry.py 脚本,从测试机器把攻击数据发往蜜罐机器,

dionaea 自动解析这些 SMB 数据包。

但是没有看到检测出 Shellcode,只看到这样的一条:

Calling WKSSVC NetAddAlternateComputerName (1b) maybe MS03-39 exploit

(是不是 dionaea 检测失败了?如果有检测到 shellcode,那么解析 shellcode就能解析到 URL 了),这个操作尝试失败!

最后题目更新了 Kippo 蜜罐的日志,这个就简单很多了。不需要安装 Kippo,直接提取其中的 playlog.py 脚本对数据进行回放即可。

诱捕陷阱

看到常识下载了一个文件(这里因为回访参数设置的问题,敲击的字符会有重复),URL 为 http:// 2792326331/fool,下载这个程序进行分析。

fool 程序是个 32 位的 EXE,里面有一些是干扰代码,比如调试的时候抛出异常、检测虚拟机、检测调试器等,并检查是否运行有 BaiduSdSvc.exe 程序,最后调用了一个程序解密了 Flag。

诱捕陷阱

这里可以采用 OD 动态跟踪的方法,或者直接从 IDA 拷贝出数据进行解密,倒是在加密数据进行赋值操作的时候,顺序被打乱了,如上图所示,所以这里采用了 OD 动态跟踪的方法。

诱捕陷阱

最后得到的 KEY 为:BCTF{Y0u_6oT_It_7WxMQ_jjR4P_mE9bV}

===================Light_4_Freedom=================

0×04    混沌密码锁[100]    From    Wins0n

首先获取正确的函数调用序列,这个可以通过随机或者循环枚举都可以,这里采用随机测试的方法,代码如下:

while True:
f1 = "fun" + chr(random.randint(0x31, 0x39))
f2 = "fun" + chr(random.randint(0x31, 0x39))
f3 = "fun" + chr(random.randint(0x31, 0x39))
f4 = "fun" + chr(random.randint(0x31, 0x39))
if f1 not in func_names or f2 not in func_names or f3 not in func_names
or f4 not in func_names:
print 'invalid function combination'
exit()
try:
answer_hash =
f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](answer))))))
except:
print "Wrong function combination, you bad guy!"
continue
print "%s %s %s %s" % (f1, f2, f3, f4)
if len(answer_hash) == 0:
continue
else:
break
print "answer_hash = %s" % answer_hash

很快找到序列为 3,5,1,4,如下图所示:

混沌密码锁

题目的要求是找到一个不一样的 usercode,使得经过这个特定的函数序列处理之后,得到的值是一样的,即上面那串中文。观察函数序列中的函数,对于zlib 的 decompress 函数,对应逆向操作为 compress,而 compress 有个 level参数,这个参数不同的话得到的数据也不同,通过这里的操作可以找到不同的usercode。

各个函数对应的逆向操作如下:

fun3 -> zlib.decompress    -> zlib.compress
fun5 -> binascii.unhexlify -> binascii. b2a_hex
fun1 -> reverse    -> reverse
fun4 -> dec2hex    -> hex2dec

所以只需要枚举 zlib 的 compress 函数的参数(从 1 到 9),得到与 answer不一样数据就可以了。

代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import zlib
import binascii
base = [str(x) for x in range(10)] + [ chr(x) for x in
range(ord('A'),ord('A')+6)]
def hex2dec(string_num):
return str(int(string_num.upper(), 16))
def dec2bin(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def hex2bin(string_num):
return dec2bin(hex2dec(string_num.upper()))
def reverse(string):
return string[::-1]
def getUserCode():
answer =
"78864179732635837913920409948348078659913609452869425042153399132863
"
answer = answer +
"90383452236525025042964516351722835662277697863791067953841"
answer = answer +
"89279098815026542757070698107378508076109161925630695936640"
answer = answer +
"94605159740448670132065615956224727012954218390602806577537"
answer = answer + "456281222826375"
tmp = binascii.unhexlify(reverse(dec2hex(answer)))
for level in xrange(1, 10):
tmp = zlib.compress(zlib.decompress(tmp), level)
tmp = binascii.b2a_hex(tmp)
tmp = reverse(tmp)
tmp = hex2dec(tmp)
if tmp != answer:
return tmp
return ""
if __name__ == "__main__":
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('218.2.197.243', 9991))
print sock.recv(4096)
print sock.recv(4096)
sock.send("3\n")
print sock.recv(4096)
sock.send("5\n")
print sock.recv(4096)
sock.send("1\n")
print sock.recv(4096)
sock.send("4\n")
print sock.recv(4096)
sock.send(getUserCode()+"\n")
print sock.recv(4096)
print sock.recv(4096)
raw_input(">")

运行之后即可得到 Key,如下图所示:

混沌密码锁

===================Light_4_Freedom=================

0×05    他乡遇故知[200]    From    dc2014

描述

逃离到中国的米特尼克与以前的老朋友都失去了联系,这让他常常怀念逝去的时光。在一次潜入某著名外企尝试获取重要资料的行动中,米特尼克还没有拿到目标文件就不幸被保安发现了。在逃离的过程中,他闯进了一个办公室,结果惊奇地发现自己二十年前的老朋友Tupper 就在眼前。更神奇的是,Tupper 知道米特尼克需要什么,给了他想要的东西并且帮助他成功脱逃。你知道米特尼克拿到的信息是什么吗?

题解

通 过 对 Tupper 的 搜 索 和 对 txt 的 分 析 , 找 到 了 Tupper’s self-referential formula。

详见:

http://en.wikipedia.org/wiki/Tupper’s_self-referential_formula

http://www.pypedia.com/index.php/Tupper_self_referential_formula

http://www.dgp.toronto.edu/people/mooncake/papers/SIGGRAPH2001_Tupper.pdf

Tupper's_self-referential_formula 如下:

他乡遇故知

pypedia 里代码,直接拷出来把 k 换掉,把@换成更容易识别的字符■,运行一下,发现如下的图像:

他乡遇故知

下面是一面乱起八糟的东西,但是上面已经界面出来了,提示我们不能用过去 17 那个秘钥,要改为使用 61,则修改代码中原来公式 17 的地方为 61,开始揭秘下面的话,需要由于不知道 key 的长度,尝试了很多次,解密图像如下:

他乡遇故知

代码清单:

#coding:utf-8

def Tupper_self_referential_formula(fd, k):
size = 61
def f(x,y):
d = ((-size * x) - (y % size))
e = reduce(lambda x,y: x*y, [2 for x in range(-d)]) if d else 1
f = ((y / size) / e)
g = f % 2
return 0.5 < g
for y in range(k+size - 1, k-1, -1):
line = ""
for x in range(0, 550):
if f(x,y):
line += "■"
else:
line += "
"
line += '\n'
fd.write(line)
if __name__ == '__main__':
a =
148636912382034555995576692484116096194593363171676933533279000356684
528422216430901192941199748379052209957708151455239433091275045678197
233644016025350327396239934825013213906121173643264195217992837686508
985963676826733629642783188946293918529184468236104413905996940627490
244577064167759626869352748510449047319209624927299429052393612631396
085388568825714988097602837851747124662186252707903674114622036743933
788736993819781940887555164012754176546886171919643936091922934758029
514813729699062597751770547933600482353800667324396043341024388288458
058016301304014795696675631793663320185114404054212408686430112619837
889970348899658139704977955050577913372931823815614740629272960988354
934354625671285177132250323255630191795939346161674707831697716940803
114009582062367593397544990161358627419125440143296206982475841750223
613767505796857673295901792707748134972160743022649777078550640855886
385644275231914987750632907936800212777693870296416048249757659264239
108859355202450131484122508272911302989095472937607341368587364011160
745965229562717184394472201047871007377540247684769785131500029243601
820543568443599671417810089467106454886255065639535140832862355644865
529344770663124649413918936149811972707215261385293393708582243572436
821843568428580139691937224111444093752128522088284509133468132602549
478420042181207368923935997131168437504520838152277850210205063398273
330182447948522267872236060415899683890073536216909834267249468231348
104232356852118092873465102466037955342789720735891258923320689543624
3759695197634560
b =
384191032741923882020478828522549318476687198144182344832549197285467
819468865670166228849020683784599434343768136699984916476964708572532
555507598904905726235726618963977315364556087249052553850554001331686
929826056047311233681409405111100536631479355429893306484823576051704
485192259146007715021127972344067969176702508991802140830367540743461
372700375918074674099443804688363023680586965330815382165191353114469
868557947452762268847537197841330442447759786036664025374680222394917
701237479727885516517536305734595653394982928683673981577216205740663
932949913078927068014282622395988112088692810459017461522246534599463
935338052319879625475197503437232882818137462236157656184514362344252
004918525670468616873209830295356136546808087941447934562532279291272
968421161595723804971320937737885016274875541613180598197214651108300
560921655211400024298217600801880977380242859964570097876339247979160
075884675310411577542632089820445039427978532707563110167256342370182
603968616086616432518479734973621588420620400757465901014148519709010
705983521964752903225458622048961746569513268721737725803791390670237
221629141687200106530190582568409339989504246218304125637225361701879
231199259679655679165048608314544863902996569304928753470351661306474
083355685647408294397967356469767165522274666706576435967759580915672
984409753933944290881997987362955070318190806767176743918131797247219
887848214671884098778356316596486561998944689053258353918021095169871
43616520436861081369579637023437701092916518239178105815040
c =
152669794468761973408950685498548383899460093078798610945605397642944
859904292811049817064246943191029655420949500241554043091683350664397
091083301514582817852522042075433071631503001021848147478052610145578
922704435485937623972164622748088948882215388039700626418841217472481
155815553528575647282947005845872101643752755807521492466827512875951
362051773917903237973639354727962957053749879923691456316838123257496
725290132614675492070953904916300537161096118344866469907507820365991
458175988320851246758870575881486171702246595524164917898669348208505
302399801670983989451810156041048759973191362253037445344957094626936
323930937616971092905789599442840831197934332949773506453275895086341
776531298026605144702782620233387902741770417712700354292654033112959
514241667872903439026784358343991052444178401483561999965532568385012
175314562329116107249755858418743006496854162965957561040748472290325
199413361117482819401612259531187409508327412376940824441788773988301
343699905954389710038741961035766130876479833655723561249974634381567
1079051736030687625988193254921373880564362679574435609784090624
d =
113271080512171612876552200807473147532402013605045974106592146535389
346224440419381709851140661852127423215564945313275395346957526325877
210173501078722698164711311174508462446631691716626904084302492487394
490216672211479783019671338578817767286063661375033111139139216768522
935483179947452726730037491218106381389310599017783858997545169990387
203318047679053019749656915138316347557833684803811629488404825488999
273893927500985500002121797134595812147320661108213632928591719324058
122754466724986207557728102031755539389763021412123923483035317073207
675084047743673233173802854723958205315191892741459843642392150928389
265566189412265002174295361180354793530341750148365209096399871772515
389974398300702166658212760167498180463975994403317897774714078692466
206112952176712785862478632588753529794940566992091305083978727734001
725590957188893399823298623435615081471254234683957454891127730927059
959504958618227397097097487018597140065497004286657587918829770738282
959389869119686714774253012505959394801546880707073922866846644797865
768640788875814800734861006113191518319588893421109154777748669761746
203783647405118937589493857086221422483130610757025827425023968890712
512581959602705188154489901202160579264695945342210790795715452075964
823039950901337300698859168094569101402295519771733516148410690868634
541645846229263054851025747185546514798467808776760359234775830740403
836547997268826665519007302895592119524010443597202519269993608332655
020946323140268130693565138293292141160713377870150122194958325607836
757398355447083563419206088642599541248394902585301619621075869887333
948843131230980907828574689848032358307964447217758687194116030133875
031784319399679548673312945793341037541373537194281832690259836814971
214524761873106679004682529241079946853097208171500554701553735807829
500798318159049835420843171875657118084123131908963858281555532621919
522227810338278671298327871196829715171516008569191762570050782688335
041561809139998521391168678573445937186614480012118402345107696951539
051582987541672905856193967650759391429352077806735136692820737616553
927449347432058559794134206441567953766707267836666250399948067932058
158109359809401272126603318095566104993859745162106372091656817007059
862778797355144480704437028488233572438903245633435161415628577159043
533982141707672121809121312619208184766363883497056915346995294499843
743199766945125844483484122579119102198032942822282863649305573399295
405939672951150677672868422194582245849099496986908729169591712964067
192489001877145386504001458174383200962316531491780595415647892440606
187968474318839866313514043125680592048744698870032655300210591863899
922249025085995338592555490729268599644457119166288371021379480590470
317127228391089556190357662320056452591713379003991659272393766477697
107781034201404664586867917510434796756198425872170629555441046584869
265959029012045722617179773622000684429886058731100498383256484941966
065207302751825081946314380679050045368234589410406580953878144487290
338672802731337733303093260673864669289238970215892311578216046822509
256555349056882354022055290889930945747688371291945749282435380299413
063475292423979901547494578192246267865663655109100430929312784859023
615384126305997752108095610965973263749512644776701564270300737734045
185301969394365082771695746441946869361807128774544488363087673604438
952223069334598523441081336161298346726688310382349989903349893853800
472732654549760911977790605172515233380986540802961338866977710050558
349670858695872121966601903136607134266480048272851997488945334819844
792830552027999085473633713184363283834567728323838302144018512610787
611653574922276251694743831375806114316108387737320866424808447652211
847277008373768913076115719807404340130413233443196800767428205325218
640376945637814848081456174887148272354594047000801542133327360650794
191440610437229072704827899530640638965377705565211857128609530043670
993251789074082519186479551138995194224520240669224111402060546845908
315293988866303054655636874256652830568906398151516049101104697318067
841714824209366951864814731228838822159978425788308716077028804411202
941012452815366884967209714395341348458696822528992427228934027375139
805293915405825753274416138062355992630385238556961401682885422305849
177012529716236913865945562128281794148968836323437677723920707512555
504455593208469400182710636866552786564045015998497140386093433949415
150390889680639818894886744118531084459320301002067457883878107769579
218120783765006221628172236032289366792339086447487561183730071026746
778439268060336315116615238336999736687289275491833635726288737137508
167302552231024976597758123928685521993494506268355253330380072351565
431640630623377163284304963285351472358021659787817156045565039439086
596690019696268272882251412959262000687115144988624851164685571129056
300180167783446173106305710077420335171662730339433528200837309392258
691310509988011940307554893280105560074009929565921297402016523526983
671986674862596292383107355311381971801416183627615636615048777622733
448767986490185356912860929408846453456871814100500789522669755250828
794470128763243221049135253732579676573653930574527448046595864871275
792465373683545981372177788527578059189095941445212982460270718860756
936093982132229556881216061203878682437626599561629904111454786301122
107791961540554496152173288419053184577336903481799014207496741590040
158631482540632294857415323195921555732506499025923121193466909413225
950395481233608259245503622051882343634310023882884315176295093208319
170319387839589188303602859191822621419419733644369850216454197195561
330240263069089138529446287215862116465254394529300313077477928346950
190182896122492415684066212110945974457626107148705533280190598093507
727531982024846885195931618891206001527704522117087391652280082135033
305601239662309311944450120396708178013226226101473482799067738939337
724795064565557861183435023868342132215318197025641204929847445066716
411145080791031062388976717404594747867889915139240655424046951055009
641233024719280345472408434465322772360706894822114864816426608825667
221224325725942497070036275374266474715568033414704975863809877313350
525998873434906951791013279499183880552162841090470092351792058649626
865466772066136393408508350605820721644205545157577960542490667212027
968868944929693303803465811477636155146753507685460419895735086731011
903289507467287729704449067085102422453382167902399261802890683714700
481578871352647290351595729645640530743930126105915400349222825990655
849876024553978838926981936876458899190291367779878701841114086827277
391430965587389160331524381958703848832625969254618446337871794739160
259215543601003924137660803291016433220287834405063775787833509466788
173485243941134372568315998277081010620412284724890641936565948304373
765449268342204900366670360676498588627476952866339404816292113359138
022103687246166655296373793870181192674489309869617207923055380644615
816132649861590561333300247390423919440234202107520250429845478778384
470111955430196329942961082547267958648439716441600412252214895670930
746329230921980139151726290832993313064005131644154917108268054048894
579397950110721534181434056387733764032155034626106925795167662464928
687026450776007849097459981803482865007414435162884992710622878426711
303308806052835859050918685759962678771906863698867677254744112806489
872218778397954942293775862305312358757772470037600092724846727275128
564218902890628661382903365594877918492340668384953651696218408000528
033514908893281503226232845906575044196009469819472190583000402170059
934818344365768077357821208810317709408039029866963201624652918612956
274809015911947001021273522505674090593884545285642337010671216005357
416347073180566756017228127877660441246359560441599856282239308172029
822627462172986684458133541279641126815220746047922066372516144440942
485296435434453400014250593836316090449391773573914455353170434497270
037549162768703487134094510248318142045729335169231738318344438544804
850128826527987542621867512295549737901697538540151715066580209347209
000065118973572572853557206612746860808619694987429948167969158138423
801671301740389330093637981641488677802678321733528836561185357787807
371761301421374950515824354825504907186733565739431883969678443431139
705759126277381268891601598164575043558140747771332584990134350686289
853918613619779694422815602918376594129128600544761222676320242548131
456354450864360253014741652553566682128043145140701914273364423204883
238538638682028093149020341685213239784563185823481655214486150410145
421461311333882994304875816425632101327862899612654174988299001565086
343905308402073097188884052104194633994445119120423511745730012963265
595501381407788731288738571380943056284351799899075752578086027474816
510657495186699741197912089032851585605387516666021225595108626220629
403317436325551559065898329942567516568254284689981882970550392371450
939928205290501811237592946736174650711758614826571139695642404780245
718665817246682004388626061325037102337045370531139628613077615223748
659833852848901620293283468857725697239032625635751349796215739588774
777541925245920836485715523229045512338073727140598526233342474523372
42809591118136903051336021250708320603340800
e =
722042903924876907043988923577327216261956015754866650395774826525806
250950250740386130825554013593314314764973648177605511163577240340369
371886568093252010521724659677708713458154318837449871237700674715438
968285839593325870314239418538008534254057342580712952276244293154845
900620361579769849411838452131262443291163745850783157943492356632133
836205373361379782083020792759668182868801219326709395303578707710818
383544553530420647742492958999826506242606472535029967897617043655049
953458707810300233084163494308734284972756215915597356164536670801712
256707116697965085981216678580712016781468204178151013972009501124618
238547937415859895129580518807970511208498368460593147730334852190147
107424242795927920013162999369114257913203623676652640728307238949309
009289452166532696936230063292295523949704683152798667619180606396311
562057881979324231645284805770935748822957670983897113911074409732097
666490514050729058587675069173873998780671956191556085603920089884697
544684019430201836281520163429859585795808304529363259837517482022234
877165275726917005278173815681489054082167233910296346202591467098094
264176548000472857140100923972817454063676850936996937720626153970840
040415681685852560098989984577121103979692014784841597745728467496545
86687353278955520
f = open('tupper_key.txt','w')
#Tupper_self_referential_formula(f,a)
#Tupper_self_referential_formula(f,b)
#Tupper_self_referential_formula(f,c)
Tupper_self_referential_formula(f,d)
Tupper_self_referential_formula(f,e)
f.close()

===================Light_4_Freedom=================

0×06    地铁难挤[400]    From    dc2014

描述

米特尼克需要用社工办法拿到 THU 安全专家的磁盘镜像以了解更多信息,于是他收买了 THU

专家的博士生,来到 BJ 市需要与博士生当面联系。但是,来到 BJ 市之后遇到的第一个问题就是交通。BJ 市人满为患,上下地铁时人们也不先下后上,而是互相挤。左边的人想挤到右边下车,右边的人也想挤到左边上车。你作为米特尼克在 BJ 的一位小伙伴,能否帮他和所有乘客设计一个尽量少移动次数的方案,使得需要上车的人都上车,需要下车的人都下车。

218.2.197.242:6000 or 218.2.197.243:6000

提示

此题是 PPC 1. 地铁和车都是背景描述而已,和题目没关系,本题的目标就是让左边的人 L都到 右边去,右边的人 R 都到左边来 2. 人的移动规则和游戏规则需要大家遍历出来,每次输入一个数字(20 以内)

题解:

拿到题目读了之后,首先连入服务器,发现给出如下的提示:

地铁难挤

我们首先要解出这么一个公式 SHA1(STRA + X).HEX() = STRB(去对应上图的相应位置),才能进入游戏,SHA1 在目前情况下用我们的机器想在有限的时间内碰撞出来是不可能的,所以猜测官方是想考一考运算速度,所以将将 STRA 和 STRB 拷贝出来,自己先测试一下能不能找到这样的 HASH,结果是在 SIZEOF(X) = 4 的时候可以找到这样的 HASH,但是运算速率太慢,

在服务器断开连接前跑不出来,所以使用多进程计算来提升效率,计算 SHA1,突破了这关以后,就得到了游戏的图像:

地铁难挤

拿到这个字符串后,有题目中的意思,是要,将所有的 L 到右边去,所有的 R 到左边来,规则是空格只能在周围 2 格内移动,换个说法,就是在公交上,只有空缺地方附近的两个人才可以站到空格上,然后流出一个新的空格,分析题目后,使用广度优先搜索算法,只要最后结果为字符串左边全为 R,右边全为 L,则为终止状态,最后得到 key,如图:

地铁难挤

代码清单:

#coding:utf-8
import threading
import socket
import hashlib
import string
import sys,itertools
from sets import Set
from math import ceil
import datetime
from multiprocessing import *
import time
class MyThread(object):
def __init__(self, func_list=None):
#所有线程函数的返回值汇总,如果最后为 0,说明全部成功
self.ret_flag = 0
self.func_list = func_list
self.threads = []
def set_thread_func_list(self, func_list):
"""
@note: func_list 是一个 list,每个元素是一个 dict,有 func 和 args 两个参
数
"""
self.func_list = func_list
def trace_func(self, func, *args, **kwargs):
#note:替代 profile_func,新的跟踪线程返回值的函数,对真正执行的线程函数
包一次函数,以获取返回值
ret = func(*args, **kwargs)
self.ret_flag += ret
def start(self):
#@note: 启动多线程执行,并阻塞到结束
self.threads = []
self.ret_flag = 0
for func_dict in self.func_list:
if func_dict["args"]:
new_arg_list = []
new_arg_list.append(func_dict["func"])
for arg in func_dict["args"]:
new_arg_list.append(arg)
new_arg_tuple = tuple(new_arg_list)
t = threading.Thread(target=self.trace_func,
args=new_arg_tuple)
else:
t = threading.Thread(target=self.trace_func,
args=(func_dict["func"],))
self.threads.append(t)
for thread_obj in self.threads:
thread_obj.start()
for thread_obj in self.threads:
thread_obj.join()
def ret_value(self):
"""
@note: 所有线程函数的返回值之和,如果为 0 那么表示所有函数执行成功
"""
return self.ret_flag
def func1(ret_num):
print "\nfunc1 ret:%d" % ret_num
return ret_num
def func2(ret_num):
print "\nfunc2 ret:%d" % ret_num
return ret_num
def func3():
print "\nfunc3 ret:100"
return 100
result=""
hasFindStr=False
alnum=string.letters + string.digits
starttime = datetime.datetime.now()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#print alnum
#print shift
def getSha1(task,child_conn):
#print task
global result
global hasFindStr
global alnum
global starttime
#print alnum
prefix, target, words = task.split(' ')
print prefix + "_" + target + "_" + words+ "_"
for i in words:
for j in alnum:
for k in alnum:
for l in alnum:
if(hasFindStr):
return 0;
#print str(i)+str(j)+str(k)+str(l) +"\n"
sha = hashlib.sha1()
sha.update(prefix+i+j+k+l)
#print sha.hexdigest()
if sha.hexdigest() == target:
result = i+j+k+l
#print result
hasFindStr = True
endtime = datetime.datetime.now()
#print (endtime - starttime).seconds
print child_conn
child_conn.send(result)
global solved
global sollist
def finished(question):
l, r = question.split(' ')
if 'L' in l or 'R' in r:
return False
else:
return True
def qswap(q, si, ti):
if ti >= 0 and ti < len(q):
lq = list(q)
lq[si] = q[ti]
lq[ti] = ' '
q = ''.join(lq)
return q, ti
def solve(question):
#qhash = []
global solved
qhash = Set([])
oplist = [-1,-2,1,2]
if ' ' not in question:
question+= ' '
space_index = question.find(' ')
q = [[question, '', space_index]]
#qhash.append(question)
qhash.add(question)
while q:
qu, op, si = q.pop(0)
for p in oplist:
nq, nsi = qswap(qu, si, si + p)
if nq not in qhash:
if finished(nq):
solved = True
return op + ' ' + str(si + p + 1)
q.append([nq, op + ' ' +str(si + p + 1), nsi])
#qhash.append(nq)
qhash.add(nq)
#raw_input('>')
#print nq
if __name__ == '__main__':
hasFindStr = False
alnum = string.letters + string.digits
shift = 4
THREAD_MAX = len(alnum)/shift + 1
hash_new = hashlib.sha1()
sock.connect(('218.2.197.242', 6000))
print sock.recv(4096)
data = sock.recv(4096)
print data
prefix = data[data.index('SHA1("')+6:data.index('" + X')]
target = data[data.index('() ==')+7:data.index('", X is a')]
print prefix
print target
parent_conn, child_conn = Pipe() # 管道通信
g_func_list = []
thread_cur = 0;
start = 0
jobs =[]
while(thread_cur < THREAD_MAX):
msg = '%s %s %s' % (prefix, target, alnum[start: start + shift])
start += shift
p = Process(target=getSha1, args=(msg,child_conn))
p.start()
jobs.append(p)
thread_cur +=1
for j in jobs:
j.join()
print "Play Game:"
print
"================================================================"
result = parent_conn.recv()
print result
sock.send(result + "\n")
print sock.recv(4096)
while(1):
print
"----------------------------------------------------------------"
data = sock.recv(4096)
if(data==""):
exit()
print "receive : " + data
if 'Round' in data:
solved = False
sollist = []
question = data.rstrip().split('\n')[-1]
if 'L' in question and 'R' in question:
if not solved:
operations = solve(question)
solved = True
sollist = operations.strip().split(' ')
op = sollist.pop(0)
op += '\n'
print "send :" + op
sock.sendall(op)

===================Light_4_Freedom=================

0×07    后门程序[100]    From    xi4o

关键函数是 0x8048DDE:

后门程序

将输入的字串与“<baidu…”进行抑或运算后,先对前十个字节进行匹配,随后开始执行后 10 个字节的代码。最开始想的是这么构造字符串:

input=(byte_804b145+shellcode)xor baidu_string

但 shellcode 在 xor 运算之后会出现 0×00,造成进行 xor 解码时无法解码,想到一个 trick,改成:

input=(byte_804b145)xor baidu_string+”\x00”+shellcode

但\x00 对应的指令会造成一个写入内存的错误,便想到在后面再加

上一个自己,最终输入字串如下:

input=(byte_804b145)xor baidu_string+”\x00\xff”+shellcode

exp 脚本如下:

后门程序

===================Light_4_Freedom=================

0×08    身无分文[200]    From    xi4o

问题出现在 0×8048840 函数,也就是列出手机号,输入购买手机号的那个函数:

身无分文

Result 代表手机的编号,可以通过这个,往高处覆盖,修改返回地址。这里过滤了负号,开始想到的是整数溢出,变为负数,但后来发现制定了只读取 8 个字节,而且是按 10 进制解析,没办法上溢,纠结了很久,偶然看了下 strtol 函数的 help 文件,发现会自动忽略空格,便想到虽然这里过滤了符号,但只是判断了第一个字节,可以用空格-100,这种形式绕过限制,再通过后面的输入信用卡信息的环节植入 shellcode,因为是写入 bss 段,所以地址固定不需要考虑 aslr。

Exp 脚本如下:

身无分文

Python exp.py|nc xxxx xx

===================Light_4_Freedom=================

0×09    最难的题目[100]    From    Wins0n

很简单的题目,IDA 反汇编,main 函数代码如下:

身无分文

fnDecryptString 函数代码如下:

身无分文

可以看到里面有两个检查调试器的函数的调用(分别为调用IsDebuggerPresent 以及通过 NtQueryInformationProcess 检查 DebugPort 状态),有一处对抛出异常的函数的调用,以及 N 次无聊的 MessageBox 弹框,后面还有一个函数调用了会抛出异常的操作,把这些无用的代码 NOP 掉之后,直接运行程序即可。

最终 Flag 为:Th3_H4rd3st_H3r3

身无分文

===================Light_4_Freedom=================

未完待续

源链接

Hacking more

...