攻防世界逆向高手进阶(持续更新)
文章目录
- dmd-50
- 做题实录
- 分析总结
- Shuffle
- 做题实录
- re2-cpp-is-awesome
- 做题实录
- 分析总结
- crackme
- 做题实录
- 分析总结
dmd-50
做题实录
附件dMd是个64位ELF文件,运行一下,让输入key,随便输入一个,报错。
IDA打开看一下
直接看if判断,发现字符串780438d5b6e29db0898bc4f0225935c0
,分析代码,看到第50行是个MD5加密,所以想到尝试MD5解密上面这个字符串,在这个网站解密的结果如下:
然后我运行程序输入grape,程序报错,好吧,看来没这么简单
进到MD5函数里看看,也没发现什么
做题一度陷入了僵局。后来又进入一个解密网站解密,发现居然解密的结果不一样{{jingxia}}
这次的结果是
运行程序输入b781cbb29054db12f88f08c6e161c199,成功。所以flag就是b781cbb29054db12f88f08c6e161c199。
后来我发现grape在MD5加密之后就是b781cbb29054db12f88f08c6e161c199,可能第一个网站比较牛逼,直接给你解析到最开始的字符串{{xiaoku}}
分析总结
这个就是简单的看源码分析找到MD5解密就行了,没什么难度。
Shuffle
题目描述:找到字符串在随机化之前.
做题实录
这是个32位elf文件,运行跑出来是乱码
放到IDA里看一下
这……不说了
直接出答案SECCON{Welcome to the SECCON 2014 ctf!}
re2-cpp-is-awesome
题目描述:他们说c++是复杂的,证明他们说的是错的!
做题实录
上来先一顿基操
IDA,开启!进入main函数
分析函数,可以发现第35行是主要的判断函数,v9就是我们输入的flag。那么flag的线索就藏在off_6020A0[asc_6020C0[v15]]
里,那先看看off_6020A0
里是什么吧。
看到一个像flag的东西,突然兴奋了起来,不会这么简单吧。继续看
好吧,本来以为是flag,但是看到这发现事情果然没有那么简单{{koubi}}
接着看asc_6020C0
,发现是一些数据
后面其实本来一开始也是db,只不过我改成dd了(按D键),至于为什么要改,是我马后炮做完题才发现的,在写脚本的时候我会说到。
从分析可以看出flag应该就是从off_6020A0
处的str(下文都叫str)中生成的。
先通过v15找出对应的asc_6020C0
中的值,再以asc_6020C0
的值为偏移量在str中找对应的字母,最终拼成flag。
有了这个思路后我就开始试着看一下flag是什么,发现asc_6020C0
第一个是“$”,按D键转成ASCII码是24h,数出来是A,接着动态调试一下看看对不对。在判断的地方下断点,然后在Debugger->Process Option->Parameters中填入要输入的参数Adawda(除了开头的A后面是随便填的),开始调试
调试中我又下了两个断点,调试之后发现A是对的,那就印证了我的猜想,那下一步就是把所有的字符找出来。
把asc_6020C0
的数据提取出来,我直接按照反汇编的结果写的脚本如下:
offset=[36,00,00,00,00,00,00,00,5,00,00,00,54,00,00,00,101,00,00,00,7,00,00,00,39,00,00,00,38,00,00,00,45,00,00,00,1,00,00,00,3,00,00,00,00,00,00,00,13,00,00,00,86,00,00,00,1,00,00,00,3,00,00,00,101,00,00,00,3,00,00,00,45,00,00,00,22,00,00,00,2,00,00,00,21,00,00,00,3,00,00,00,101,00,00,00,00,00,00,00,41,00,00,00,68,00,00,00,68,00,00,00,1,00,00,00,68,00,00,00,43] #这是最后字符串的偏移量 注意刚提取出来的时候数都是16进制的,我改成了10进制str = 'L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t'for eax in range(0,31):i = offset[eax*4]print(str[i], end = "") #后面的end是让打印不自动换行#得出结果: ALEXCTF{W3_L0v3_C_W1th_CL45535}
在这一步我卡了好久,因为我在手动把16进制修改成10进制的时候不小心删了个00,然后卡了半天。后来终于发现少了个00补上了但是补错了位置……导致得出了一个这样的flag:ALEXCTF{W3_L0v3LC_W1th_CL45535}
这完全就是一个flag该有的亚子好吗?然后我就怀着激动的心情提交了,然后,系统告诉我,错了
所以说:
细心真的很重要很重要。
不过,我后来发现,特喵的这不是dd双字字形吗,难怪eax要乘4,难怪那么多的0。就因为漏了个0卡了我好久我去
所以我在写这篇文章的时候才把asc_6020C0
的数据用dd表示出来,这样就非常直观简洁了
分析总结
实际上做完再回过头来再看这道题,可以看出这道题其实并不算难,但是这道题花了我很多的时间,我很早就注意到了off_6020A0[asc_6020C0[v15]]
这个关键点,但是当时看到asc_6020C0
的不知道是干啥的数据时有点懵逼,最后硬是汇编调试了半天才反应过来,然后就没有顾其他的直接按照汇编语言写脚本了。实际上做完题之后一看到++v15,每次只自增1,就明白了数据是双字存放的,如果当时冷静下来再思考一下,应该就能很快把这道题做出来。
这个题让我认识到:1.汇编还得好好学。2.IDA真NB,而我连D键咋用都不知道。不行,IDA PRO权威指南,打开!3.我确实是个菜狗,还得多做题{{liulei}}
crackme
做题实录
IDA看看源码:
根本不知道这是什么玩意儿,看来是加了壳,PEiD看一下有什么。
可以看到壳是nSPack 3.7,那么就先用UnPackNsPack3.7脱壳,脱完壳之后再分析:
可以看到就是简单的算法逆向,关键语句是第15句,我们看看Notflag和arg(名字我改过了):
可以看到Notflag是字符串,arg是一个数组,那么就写个脚本跑出来就行了:
notflag = 'this_is_not_flag'
arg = ['12', '4', '8', '14', '24', '5C', '4A', '3D', '56', '0A', '10', '67', '0', '41', '0', '1', '46', '5A', '44', '42', '6E',¦ '0C', '44', '72', '0C', '0D', '40', '3E', '4B', '5F', '2', '1', '4C', '5E', '5B', '17', '6E', '0C', '16', '68', '5B', '12']arg2 = []
for i in range(len(arg)):arg2.append(int(str('0x') + arg[i],16))
print(arg2)flag = ''
for i in range(len(arg2)):flag += chr(arg2[i] ^ ord(notflag[i % 16]))
print(flag)
#得出结果:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
分析总结
实际上我认为这道题的难点在于脱壳,我直接用了大佬的工具,具体脱壳流程我还不会,还需要继续学习。
大佬的工具参见这篇文章《[原创]NsPack 3.7 浅析 (7.3更新脱壳机和源码)》
攻防世界逆向高手进阶(持续更新)相关推荐
- 攻防世界misc高手进阶区刷题记录
攻防世界misc高手进阶区刷题记录 easycap 解压出来之后为一个pcap文件,使用wireshark打开 右键追踪TCP数据流即可获得flag flag:385b87afc8671dee0755 ...
- 攻防世界-web高手进阶区
文章目录 攻防世界-web高手进阶区 1.baby_web 2.Training-WWW-Robots 3.Web_php_include (文件包含+伪协议) 1.方法 2.方法 4.ics-06( ...
- 攻防世界 web高手进阶区 8分题 Web_python_block_chain
前言 继续ctf的旅程 开始攻防世界web高手进阶区的8分题 本文是Web_python_block_chain的writeup 解题过程 这是个区块链题 这..裂开了啊 没搞过区块链 从零开始学习 ...
- 攻防世界 Reverse高手进阶区 3分题 crackme
前言 继续ctf的旅程 攻防世界Reverse高手进阶区的3分题 本篇是crackme的writeup 攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 查壳,显示nsPack壳 找了个 ...
- 攻防世界逆向高手题之reverse-for-the-holy-grail-350
攻防世界逆向高手题之reverse-for-the-holy-grail-350 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的reverse-for-the-holy-grail-350 ...
- 攻防世界 Reverse高手进阶区 2分题 reverse-for-the-holy-grail-350
前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是reverse-for-the-holy-grail-350的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数 ...
- 攻防世界 web高手进阶区 9分题 favorite_number
前言 继续ctf的旅程 开始攻防世界web高手进阶区的9分题 本文是favorite_number的writeup 解题过程 进入界面 简单的代码审计 首先是个判断,既要数组强等于,又要首元素不等 然 ...
- 攻防世界 Crypto高手进阶区 3分题 wtc_rsa_bbq
前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是wtc_rsa_bbq的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个无后缀文件 扔 ...
- 攻防世界逆向高手题之dmd-50
攻防世界逆向高手题之dmd-50 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的dmd-50 下载附件,照例扔入exeinfope中查看信息: 64位ELF文件,无壳,照例扔入IDA64位中 ...
最新文章
- 插件编写傻瓜教程VC6.0
- SpringBoot之配置自定义新建文件
- boost::format模块format的基本用法示例
- W3C DOM操作之创建新节点
- JDK 8与JDK 10:三元/拆箱的区别
- 机器视觉系统图像采卡基本概念
- 好用!一键生成数据库文档,这个开源的文档生成工具值得了解
- VS2010_release_exe生成
- 常用php操作redis命令整理(五)ZSET类型
- Java关于抽象类是否可以实例化问题
- 现代信号处理 张贤达_著名科学家、清华大学张贤达教授逝世,享年 74岁
- 解决NLPIR汉语分词系统init failed问题
- js正则表达式校验手机号码和电话号码
- docker下编译mangoszero WOW60级服务端(一)
- 手机低端市场,联发科 vs 高通
- R语言——read.table;read.csv(读取外部数据)
- HTML页面可视化快速设计
- c语言原子操作实例,多CPU上的原子操作
- 2015年十大最具有影响力的免费网站推广方式
- 阿里云“快进”背后:云计算形势重构,深耕产业数字化