xman 厦门邀请赛 pwn1 babystack writeup

本文详细介绍了xman厦门邀请赛中的Pwn1题目——babystack,分析了64位二进制文件的栈溢出漏洞,包括绕过canary保护、获取libc基地址、利用ropchain进行代码执行。通过puts函数控制变量s,利用栈溢出获取canary值,然后计算libc基地址,最后利用gadget实现远程代码执行。在漏洞利用过程中,作者强调了参数传递、字符串转换和Python中的struct模块的重要性。
摘要由CSDN通过智能技术生成

题目描述:

这个题目针对现在的我还是有点难度的,花费了我三天的时间,最后发现原因竟是因为字符转化为整型的过程中多加了好多0.

分析思路:

1、首先查看文件的详细信息:

tucker@ubuntu:~/xman/pwn/pwn1$ file babystack
babystack: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=d1d54a6fc21f6c1d9a92f4f3bfafadd44683afd4, stripped
tucker@ubuntu:~/xman/pwn/pwn1$ checksec babystack
[*] '/home/tucker/xman/pwn/pwn1/babystack'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

是一个64bit的二进制文件,没有开启PIE,但是开启了canary保护,因此我们首先想到的就是绕过canary保护。

2、使用IDA打开:

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  int v3; // eax
  char s; // [rsp+10h] [rbp-90h]
  unsigned __int64 v6; // [rsp+98h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  memset(&s, 0, 0x80uLL);

  while ( 1 )
  {
    puts_info();
    v3 = j_read();
    switch ( v3 )
    {
      case 2:
        puts(&s);
        break;
      case 3:
        return 0LL;
      case 1:
        read(0, &s, 0x100uLL);
        break;
      default:
        j_puts("invalid choice");
        break;
    }
    j_puts((const char *)&unk_400AE7);
  }
}

从中我们很容易看到并且在puts(&s)中我们也可以控制s的值,从而打印出我们需要的信息。在前面的memset中仅仅初始化了0x80个字节,但在read(0, &s, 0x100uL)读取了0x100个字节,因此存在栈溢出漏洞。

3、我们需要注意,程序为了防止canary泄露,canary的第一个字节为\x00,因此我们首先我们构造payload&#x

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值