hitb-2017 1000levels writeup

该博客详细分析了hitb-2017比赛中一个二进制漏洞,包括go函数中的未初始化变量问题、level函数的栈溢出以及hint函数中system的栈放置。利用思路涉及将system地址与one_gadget结合,通过栈溢出和vsyscall的gettimeofday来构造rop链,最终实现漏洞利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目分析

题目设置的还是比较巧妙的。

本身是一个二进制的文件,linux 64环境,保护情况如下:

    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      PIE enabled

功能一共三个:
1. go: 选择一个level,然后会再问你一次level,输入之后,回答两次level想加这么多次的问题,就是a * b类型,回答完成之后输出你在多少秒内完成了多少level
2. hint: 打印NO PWN NO FUN
3. give up: 退出

实现如下:

go

int go(void)
{
  int v1; // ST0C_4@10
  __int64 v2; // [sp+0h] [bp-120h]@1
  int v3; // [sp+8h] [bp-118h]@9
  __int64 v4; // [sp+10h] [bp-110h]@0
  __int64 v5; // [sp+10h] [bp-110h]@4
  signed __int64 v6; // [sp+18h] [bp-108h]@7
  __int64 v7; // [sp+20h] [bp-100h]@10

  puts("How many levels?");
  v2 = read_num();
  if ( v2 > 0 )
    v4 = v2;
  else
    puts("Coward");
  puts("Any more?");
  v5 = v4 + read_num();
  if ( v5 > 0 )
  {
    if ( v5 <= 999 )
    {
      v6 = v5;
    }
    else
    {
      puts("More levels than before!");
      v6 = 1000LL;
    }
    puts("Let's go!'");
    v3 = time
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值