-
-
[原创]看雪CTF.TSRC 2018 团队赛 第二题 半加器 write up
-
发表于: 2018-12-3 19:46 3157
-
系统 : 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下断点:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创][安全运维向]模拟搭建小型企业内网 14349
- 攻防世界-PWN-高手进阶区-难度3到4-全部题解 18861
- [原创]攻击格式化字符串在.bss段的程序(bugku-pwn6) 15274
- [原创]XCTF攻防世界-pwn新手练习区全部十题解析 14392
- [原创]KCTF2021 第二题 write up 5549