-
-
[分享]readme_revenge - 34C3 2017 CTF
-
发表于: 2017-12-31 15:06 6043
-
比赛时间没有做出来, 只能赛后看大师傅们的 WP学习一波
main函数如下:name
在bss
段的0x6B73E0
地址处. 程序是静态链接的, 所以我们可以一直向后溢出, 覆写掉后面的libc的指针, 从而尝试控制执行流.
尝试输入很大的字符串, 程序会出错
程序断在在0x45ad64
处出了错, 在IDA
里可看到这个错误是因为内存非法访问导致的, __printf_modifier_table
已经被我们溢出为了0x6161616161616161
, 在下方的cmp
处比较时, 因为该内存地址不可访问导致了错误, 我们可以通过更改__printf_modifier_table
的值来绕过这个错误.
比较有趣的点是这段代码后不远处的一段代码, 可以看到这里有一个call rax
, 而rax的来自于以__printf_arginfo_table
为基址, 加上一个偏移后的地址中取出的一个值, 而__printf_modifier_table
、__printf_function_table
和printf_arginfo_table
都处于我们可控的位置, 所以只要精心调整我们的输入就可能有机会劫持控制流(事实证明确实可以)
比赛时间只做到了这里, 和队友都以为是要劫持栈到可控位置, 然后ROP, 然而最后也没有成功, 看WP才知道原来flag已经在程序中了, 只需要想办法打印出来即可, 当时还真没看到:)
我们现在已经可以控制EIP了, 此时我们可以调用__fortify_fail
函数, 这个函数会打印当前程序的名称(__libc_argv
的第一个元素). 所以只要使__libc_argv
的第一个元素指向flag
的地址就可以打印出flag
exploit如下:
看了师傅的文章发现自己文章写的太粗糙了,有很多细节没有写清楚,以后会多加注意,多谢师傅的提醒。附上师傅文章的链接:[原创]readme-revenge details
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课