首页
社区
课程
招聘
[原创]看雪CTF.TSRC 2018 团队赛 第二题 半加器 write up
发表于: 2018-12-3 19:46 3172

[原创]看雪CTF.TSRC 2018 团队赛 第二题 半加器 write up

2018-12-3 19:46
3172

系统 : Windows 7
程序 : 半加器
要求 : 输入口令
使用工具 :od

我们运行程序,发现弹出提示字符串Please Input:,od中搜索字符串,发现具体信息如下:

定位到相关代码段:

在输入字符串后的返回地址下断:
004319FB |. 83C4 0C add esp,0xC
然后按F8单步走,简单的就能猜出call Exam.0041A9A6是在计算字符串长度,接着对字符串长度进行控制:

这代表输入一个长度10的字符串就可以,我们用1234567A90代替输入,因为有以下检测代码:

F8执行到这一步,发现我们的字符串有了明显的变化:

我们查看调用子函数后的字符串:

我们在内存窗口中选择前四个字节,右击->断点->内存访问。完成后F9让程序继续执行,看看是什么代码访问了操作后的字符串:

发现是一段比较字符串是否相等的汇编代码,我们查看程序内的用于比对的固定数据:

做到这里,有经验的朋友都知道。程序对输入的字符串做操作,作比较之后,就会输出成功与否的提示了。我们不妨直接将内存断点先删除,将以上数据的值直接复制给我们的字符串,看看输出如何。

我们直接在内存窗口中定位我们的字符串,双击第一个字节,出现编辑窗口。此时,取消掉保持大小的单选框,然后将以上数据的hex值直接黏贴(包括00结束值)。完成后,直接F9运行程序:
Please Input:1234567A90 ok
发现程序提示成功,如果程序一闪而过,可以在od里按Alt+k查看调用栈,在退出之前对相关代码段下断。

此时,我们再回头定位分析操作字符的函数,按Ctrl+F2重新调试:

进行函数前,用之前的方式对我们的字符串下内存访问断点,然后直接F9运行程序,第二断下时到达关键算法:

这是把字符串的第八位置赋值#,然后整个字符串和0x1F异或。

程序首先对字符串进行格式检查,然后检查第八位是否为A,接着,在异或操作之前对第八位赋值#,字符串整体与0x1F异或。最后,与字符串urj}pux<}n{iqyrh对比,相同则成功。

我们不妨用urj}pux<}n{iqyrh作为输入,当然,第八位要改为#,也就是urj}pux#}n{iqyrh直接传入xor循环,然后让其帮我们输出password。最后,因为输入要求的关系,将结果的第八位改成A,就ok了。

将xor函数的输入改成:

然后在循环的结束位置0x00BADC40下断点:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//