杭电CTF 练习题RE WP

密码

1. BAABAABBAAAAAAAABABBABABBBAABABAABBABBBAABBABAABAA
提示:答案是十个字母

直接培根密码解密

RE

1. Beat our dice game and get the flag

拖进IDA太乱了,但可以找到关键字符串,拖进OD查看

显然最后要达成的就是31337然后获得flag,规则是掷色子,试试看能不能爆破

一路单步执行最终调试到这里,显然是有个rand模块的

继续往下就看到cmp语句的比较然后跳转,试着nop掉,依次类推

最后全部改完就可以拿到flag了

2. 从所给文件中找flag

下载下来的文件无文件尾,去linux里用file命令查看文件尾,最后知道其文件尾为.tar.xz,改名后解压出来了六个文件

重复上一个步骤

乍一看,感觉只有文件1有用,拖到IDA用字符串定位一波

看上去就像是第一题64位文件

直接试着用gdb同样来爆破试试看,设断点,我刚开始多断了一个,不要在意这些细节,如下

这里也就展示一下要修改哪些,我自己是在IDA改的,其次里面这个程序有个防作弊系统,我们也要直接jmp掉

改完之后发现文件在linux底下运行不起来,说什么文件被截断了

然后我队友说解压出来只有一个文件,我就自闭了……然后用它的附件试一下同样的方法

我改IDA失败后运行失败了,只能用gdb一步步来了……世界在第一次判断的时候跳转到最终目标就好了,结果如下

3. 找flag

打开压缩包是个exe,还行

getflag被灰化了

用resource_hacker查看,起初我想的是直接将这个界面跳过去看下一个界面,但是用OD打开后发现在messageboxA函数,然后看到了flag,23333…………

其实直接搜索比较字符串的模块就可以定位到了,开始解密,提示是md5,但其实吧当中的符号删掉就好了,233

试着去掉灰化,但我没找到menuitem之类的函数,经过推荐,知道了一个东西叫spy++,可以获取句柄属性,然后在VS里用spy代码进行发送鼠标按下的操作即可

#include <Windows.h>

int main()
{
	Sleep(2000);
	SendMessage(HWND(0x00090DD6), WM_LBUTTONDOWN, 0, 0);//按下鼠标左键
	SendMessage(HWND(0x00090DD6), WM_LBUTTONUP, 0, 0);//松开鼠标左键

	return 0;
}

运行代码之后相当于模拟了一次鼠标点击,即得flag

4. 找flag,么么哒

解压完是一个exe,大概就是如下图所示

直接搜索字符串就有了…………

按照第三题的做法试了一遍,发现不对

应该漏了什么,在文件里搜索字符串很容易可以发现密码,看看之后对密码以及flag有什么操作

拖进IDA,我们可以看到输出flag之前还有一个函数,我们跟踪进去发现是对flag函数的一个修改,所以我们看到的flag是假的……

进去之后我们发现就是个异或操作

脚本走一波(开头那个什么md5的是要留着的,别改)

s='065ca>01??ab7e0f4>>a701c>cd17340'
key='NSCTF_md5'
flag=''
for i in s:
    flag+=chr(ord(i)^7)

print(key+flag)

#NSCTF_md5712df97688fe0b7a399f076d9dc60437

5. During my time at KGB I learned how to hide all the stuff from alpha-dog. But damn it, I somehow lost some of the most important files…

反正就是有东西丢了

这题还是没有文件尾,我先用winhex打开,发先里面有一段英文故事

这感觉都不是逆向题目,有点像传说中的取证题,在一大堆故事内容中放一个文件,但是这里应该是不小心删除掉了,我们要恢复过来

我们binwalk分解一下,如下

ext文件就是那些故事内容,我们可以看见一个压缩包

没有密码,不挣扎了,反正如果题目没骗我,重要的文件已经丢了,而且解压出来的文件应该就是我们可以看见的secret,打开secret看见的也只是乱码

我们试着恢复文件

执行extundelete --restore-all secretArchive.6303dd5dbddb15ca9c4307d0291f77f4

发现一个文件夹,里面有超多文件,但好像就是小说……但有一个文件很特殊,可以移到windows里排个序看很明显,如下

查看该文件类型,发现是一个使用KGB Archiver 软件进行了3级压缩的文件,如下

下载这个软件进行压缩就好了

6. 用浏览器控制台求解很方便!!!

下载下来一个exe

这个提示我起始不是特别明白,然后逐渐单步执行再配合字符串,定位到了4010C6

继续慢慢往下调,单步到判断判断输入密码是否正确的附近,可以发现关键代码,用来判断输入的密码是否正确

其中eax存放的是我们输入的值,而ecx里存放的是正确的密码(变形前还是变形后的不清楚,call进之后的函数去看看)

进去之后第一快区域基本就是判断输入的是不是这个值

正确的密码可以在动态运行的时候直接找到的,参照IDA中运行脚本也是可以的,代码如下)

s='(*GHDfhboqiwuef892q37xcv;lkjhqasdlkfj;lkcjv;lLKHasdfklnLKjh;laskdfhnIO*&YOIUHNlkidfhv8079hlkjBOIUT6tf23p04-09ujlv;kn098YIUhrlk4rn[p9udvlkm1p9yh8UGkjhpIHRPON*&^RFCLKJNPOIUEWDIUH3o4ifgoivc3o98749&*foijzxbcv*&*&t3214asdvzxcCLIKKH98duyfi2wjnepfoicpikvpoisudf-908u34rsd;ldfknv;ldksfhv098y9uihn048yfpOIUH)(8fh423kj5thngoxfchvjknh0(*Yopiernt09u82hgkjdfncv098Ypfoin234pfuih9ewuihnrfgKLJSAOIpeuyh4unfg;fkvb09843hkjvnpI*YOIEnrp2o3ijf9ijxdcpLIHJ-98fy23knfposdiuv-39jefoik1hrf89ujfdvmkpIud1ije-f92LOIXJHC(Inempwqkfnp9234uf-0eikf1p3io4fj-9fov;lkwqnfdpviJOSDjfp2oi3rjf-09dfjv;lk13mfij-13094fuqwkl1p[3409rocfmv'
#print(len(s))
key='(3q^;^3lfjq&D7V4Hhd'
key_new=[]
s_new=[]
for i in key:
    key_new.append(i)
#print(key_new)
for i in s:
    s_new.append(i)
#print(s_new)
for i in range(19):
    key_new[i]=s[47*i%99]

print(key)

#(3q^;^3lfjq&D7V4Hhd

我们输入正确的密码(3q^;^3lfjq&D7V4Hhd后,继续执行到另一端好像还有别的操作,不然的话直接跳转到正确语句块应该就好了,如下

进去时候我们可以设置跳转大密码正确的字段,如下图所示

令人意外的是,从语句40100F开始,程序生成了一个全新的字符串,意思就是找到了密码,最后的字符串也是全新的,我们单步执行,记录下来,最后我们去地址[ebp+eax-0x14]地址处的数据窗口出观察,就可以得到答案了,如下

7. 小磊生病了,医生检查出小磊体内有两种有害病菌B和C是引发的关键,同时也找到的消灭病菌的有益菌A ,现在要你帮助A战胜B和C,治好小磊,小磊会告诉你flag是什么。

下载下来一个exe

里面就三个元素,应该是对应A、B、C

拖进IDA,观察疑似flag的生成处,如下

最后一定是以v39的地址为基址,然后以v24为地址索引,打印出一个字符串

观察一下上面的那一串代码有没有对v39和v24做改变,并没有,全是混淆代码,不用管

注意小端序,然后在IDA里面也可以看到v39只有4个连续的字节,也是比较好区分的

上脚本

v39='neFolieIhrTHe'
v24=[2,5,9,6,7,0,10,8,12,11,3,4,1]
flag=''
for i in range(len(v24)):
    flag+=v39[v24[i]]

print(flag)

#FireInTheHole

8. 下载到对方可执行程序一个,但…..

下载下来一个exe,但是打开后立刻就会闪退

拖进OD动态调试一下,靠字符串观察一波关键代码

可以发现000B10A2处的语句执行后会永远跳过flag的判断,导致我们闪退

依次爆掉所有前往正确途中的断点,拿到key就好,如下图,其实我们早就知道key了,因为已经提前泄露了……只不过验证一下,看看有没有flag之类的,最后表明没有,key本身就是flag

猜你喜欢

转载自blog.csdn.net/qq_42192672/article/details/82873344
今日推荐