首页
论坛
课程
招聘
[原创]一道长见识的题
2021-12-2 01:09 11226

[原创]一道长见识的题

xym 活跃值
4
2021-12-2 01:09
11226

这题比较简单,就不贴代码了,光讲讲没有内核调试环境下的做题思路。
关于输入的追踪,在经过一轮类base64编码后,突然就卡在了一条call far指令上。该指令几乎不讲任何道理的忽略任何断点和跟踪,直接在输出的地方返回了“错误”的信息。直觉告诉我,这道题涉及到了我的知识盲区,于是赶紧搜索call far fword这样的关键字,很快,一大堆调用门的介绍出现在了眼前,而且很多都带了源码。有兴趣的可以自己搜索看看。
于是找了其中几个下载测试了一下,编译都很顺利,但是执行的时候无一例外都报错。貌似必须在内核修改东西才能执行call far跳转,但是我没有内核调试环境,也不知道怎么修改所谓的GDT表,但是这个时候金左手的一血都已经出来了,我不能再拖下去了。
怎么办?我突然看到实例代码里call far写的函数其实就在main函数的上方,也就是说虽然是call far,但是实际代码很可能是一起的,而且尽管所有文章都说call fword里面的ip是废弃的,没有实际意义,但是这里的ip指向的确实像一个函数,往下拉,居然使用了retf作为返回,那这个就是关键处理函数无疑了。
但可惜的是在这里下软件断点程序会无法执行,而下硬件断点毫无反应,也就是说这里可能是函数的一个镜像,但肯定不是函数真正执行的地方,真正执行的地方应该还是在内核。
没关系,强行修改call far为普通call,这样就可以正常调试本该在内核执行的代码了。调试发现里面还通过edi调用了一个函数,里面会从0xfffffff4之类的地址读取数据,由于调试的代码并不在内核,因此自然无法获取相应地址的值,跳过读取数据的代码,发现下面经过简单的解密之后就与编码后的输入进行了比较判断,然后根据结果解密了“正确”或者“错误”到输出。
也就是说这个藏在内核不知何处的数据就是解题的关键,但是普通权限下直接看肯定是看不到的,这个时候联想到下软件断点程序会无法执行的特点,说明这段函数的代码在内核里也是会被相应修改的,因此手动修改解密“错误”到输出的这段代码,使其将关键数据输出到了用户界面上。
最后找到题目中base64的编码表,用该编码解码关键数据,得到flag。


【公告】看雪招聘大学实习生!看雪20年安全圈的口碑,助你快速成长!

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回