首页
社区
课程
招聘
[原创]看雪2018CTF第三题Writeup
发表于: 2018-6-21 10:26 2925

[原创]看雪2018CTF第三题Writeup

2018-6-21 10:26
2925

将程序拖入IDA分析,首先执行test函数。


test函数通过使用ptrace(PTRACE_TRACEME,0,0,0)系统调用检测自身是否被反调试。

0x01 流程分析

将程序拖入IDA分析,首先执行test函数。


test函数通过使用ptrace(PTRACE_TRACEME,0,0,0)系统调用检测自身是否被反调试。

检测完成后返回主函数
 
主函数首先通过mprotect函数调用将代码段属性加入可写属性。
之后向bss段读6字节数据,根据下面判断程序使用了smc,6字节数据为解密密钥。
经分析解密步骤为  解密第一部分使用第一字节为密钥,解密第二部分,使用上一部分密钥xor第二字节,以此类推。
经观察被加密数据发现,程序每隔一段会出现三个字节相同的一段密文。猜测这三字节原本为0x0,事实证明,的确如此,因此每部分解密使用的密钥都可以得到,最终得到密钥evXnaK。

解密完成后的代码有两次输入,第一次可输入长度为1a的数据,并使用printf输出,此处存在格式化字符串信息泄露。
第二次输入长度为0x200,目标为 rsp-0x20,存在栈溢出漏洞。

0x02 攻击分析

1.信息泄露
检测发现程序有canary保护,绕过可使用格式化字符串泄露出canary的值,通过%13$lx%17$lx泄露处canary的值及栈的地址。
1.信息泄露
2.溢出攻击
程序开启了nx保护,所以栈没有代码执行权限,经过ropgadget发现程序中并没有足够多的rop可以使用,同时最大问题在于并不知道libc的版本,无法得到system函数的地址(试了好几次都失败了所以换思路了。。),程序中存在mprotect系统调用改变代码段属性,在main函数的结尾0x400a9f处存在一处mprotect调用,使rdi指向的内存地址变为可读可执行属性。程序内存在pop rdi,ret的代码,于是可以控制栈为可执行,写入shellcode入栈即可执行。

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

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