首页
社区
课程
招聘
[分享]readme_revenge - 34C3 2017 CTF
发表于: 2017-12-31 15:06 6043

[分享]readme_revenge - 34C3 2017 CTF

2017-12-31 15:06
6043

比赛时间没有做出来, 只能赛后看大师傅们的 WP学习一波

main函数如下:

namebss段的0x6B73E0地址处. 程序是静态链接的, 所以我们可以一直向后溢出, 覆写掉后面的libc的指针, 从而尝试控制执行流.

尝试输入很大的字符串, 程序会出错


程序断在在0x45ad64处出了错, 在IDA里可看到这个错误是因为内存非法访问导致的, __printf_modifier_table已经被我们溢出为了0x6161616161616161, 在下方的cmp处比较时, 因为该内存地址不可访问导致了错误, 我们可以通过更改__printf_modifier_table的值来绕过这个错误.

比较有趣的点是这段代码后不远处的一段代码, 可以看到这里有一个call rax, 而rax的来自于以__printf_arginfo_table为基址, 加上一个偏移后的地址中取出的一个值, 而__printf_modifier_table__printf_function_tableprintf_arginfo_table都处于我们可控的位置, 所以只要精心调整我们的输入就可能有机会劫持控制流(事实证明确实可以)

比赛时间只做到了这里, 和队友都以为是要劫持栈到可控位置, 然后ROP, 然而最后也没有成功, 看WP才知道原来flag已经在程序中了, 只需要想办法打印出来即可, 当时还真没看到:)

我们现在已经可以控制EIP了, 此时我们可以调用__fortify_fail函数, 这个函数会打印当前程序的名称(__libc_argv的第一个元素). 所以只要使__libc_argv的第一个元素指向flag的地址就可以打印出flag

exploit如下:

看了师傅的文章发现自己文章写的太粗糙了,有很多细节没有写清楚,以后会多加注意,多谢师傅的提醒。附上师傅文章的链接:[原创]readme-revenge details


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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