头都大了了 2022-08-27 18:45 采纳率: 85.7%
浏览 74
已结题

【PWN】入门-函数相关问题

// gcc -o prob prob.c -m32 -no-pie -fno-stack-protector -O0 -mpreferred-stack-boundary=2
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

void welcome() {
    
    printf("Welcome to 25th HackingCamp !\n");

}
void read_flag() {

    char buf[39];
    memset(buf, 0, 39);

    int fd = open("/home/user/flag", 0);
    if (fd < 0) { exit(-1); }

    read(fd, buf, 39);
    write(1, "\nHere flag : ", 13);
    write(1, buf, 39);

    close(fd);

    write(1, "\n", 1);
    exit(0);
}

int main() {

    char name[0x20];
    memset(name, 0, 0x20);
    void (*func)() = welcome;

    func();

    write(1, "Your age : ", 11);
    int a;
    scanf("%d", &a);
    if (a == -128) return 0;

    char age = a;

    if(age < -127) {
        write(1, "Your name : ", 12);
        read(0, name, 0x25);
    
        write(1, "Hello, ", 7);
        write(1, name, strlen(name));

        func();

    }

    return 0;
}

那位师傅能帮我讲解一下这个程序的弱点和payload应该怎么设计

  • 写回答

2条回答 默认 最新

  • Yofoo 2022-08-27 20:18
    关注

    char name[0x20];
    read(0, name, 0x25);
    这里存在漏洞, 输入超过0x20就会溢出, 部分编译器就可能溢出到func
    void (*func)() = welcome;

    根据上面的东西就可以输入指定地址值给变量func, 然后被调用
    read_flag 代码没用到, 这个地址需要其他方法获取, 比如根据welcome地址猜测

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月4日
  • 已采纳回答 8月27日
  • 创建了问题 8月27日

悬赏问题

  • ¥15 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类